/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact bc7ab980abcc211083148eeaea571c4511f41238:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 33 36 34 20 32 30 30 38 2f 30 34 2f 30 31 20  .364 2008/04/01 
0220: 31 35 3a 30 36 3a 33 34 20 64 72 68 20 45 78 70  15:06:34 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
04e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
04f0: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0500: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0510: 45 78 70 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  Expr);.  }.#ifnd
0520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
0530: 41 53 54 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  AST.  if( op==TK
0540: 5f 43 41 53 54 20 29 7b 0a 20 20 20 20 72 65 74  _CAST ){.    ret
0550: 75 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e  urn sqlite3Affin
0560: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
0570: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  token);.  }.#end
0580: 69 66 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70  if.  return pExp
0590: 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a  r->affinity;.}..
05a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
05b0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
05c0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
05d0: 70 45 78 70 72 20 74 6f 20 62 65 20 74 68 65 20  pExpr to be the 
05e0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
05f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 62 79 20 70  uence named by p
0600: 54 6f 6b 65 6e 2e 20 20 20 52 65 74 75 72 6e 20  Token.   Return 
0610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
0620: 20 72 65 76 69 73 65 64 20 65 78 70 72 65 73 73   revised express
0630: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ion..** The coll
0640: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
0650: 73 20 6d 61 72 6b 65 64 20 61 73 20 22 65 78 70  s marked as "exp
0660: 6c 69 63 69 74 22 20 75 73 69 6e 67 20 74 68 65  licit" using the
0670: 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 0a 2a   EP_ExpCollate.*
0680: 2a 20 66 6c 61 67 2e 20 20 41 6e 20 65 78 70 6c  * flag.  An expl
0690: 69 63 69 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  icit collating s
06a0: 65 71 75 65 6e 63 65 20 77 69 6c 6c 20 6f 76 65  equence will ove
06b0: 72 72 69 64 65 20 69 6d 70 6c 69 63 69 74 0a 2a  rride implicit.*
06c0: 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * collating sequ
06d0: 65 6e 63 65 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ences..*/.Expr *
06e0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
06f0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
0700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
0710: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
0720: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 30 3b  char *zColl = 0;
0730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0740: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
0750: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0760: 63 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  ce */.  CollSeq 
0770: 2a 70 43 6f 6c 6c 3b 0a 20 20 7a 43 6f 6c 6c 20  *pColl;.  zColl 
0780: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
0790: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
07a0: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
07b0: 20 70 45 78 70 72 20 26 26 20 7a 43 6f 6c 6c 20   pExpr && zColl 
07c0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
07d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
07e0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
07f0: 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  l, -1);.    if( 
0800: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
0810: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43  Expr->pColl = pC
0820: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 45 78 70 72  oll;.      pExpr
0830: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
0840: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a  pCollate;.    }.
0850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
0860: 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 72 65 74  ee(zColl);.  ret
0870: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0880: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
0890: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
08a0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
08b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
08c0: 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20  pr. If.** there 
08d0: 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  is no default co
08e0: 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65  llation type, re
08f0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53  turn 0..*/.CollS
0900: 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43  eq *sqlite3ExprC
0910: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
0920: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0930: 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  r){.  CollSeq *p
0940: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  Coll = 0;.  if( 
0950: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 69 6e 74  pExpr ){.    int
0960: 20 6f 70 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d   op;.    pColl =
0970: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
0980: 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
0990: 70 3b 0a 20 20 20 20 69 66 28 20 28 6f 70 3d 3d  p;.    if( (op==
09a0: 54 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54  TK_CAST || op==T
09b0: 4b 5f 55 50 4c 55 53 29 20 26 26 20 21 70 43 6f  K_UPLUS) && !pCo
09c0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
09d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  rn sqlite3ExprCo
09e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
09f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
0a00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c   }.  }.  if( sql
0a10: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
0a20: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
0a30: 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ){ .    pColl = 
0a40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
0a50: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
0a60: 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72  pExpr is an oper
0a70: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0a80: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0a90: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0aa0: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0ab0: 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  he other operand
0ac0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
0ad0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
0ae0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
0af0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0b00: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
0b10: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
0b20: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0b30: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0b40: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0b50: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0b60: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0b70: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0b80: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0b90: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0ba0: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0bb0: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0bc0: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
0bd0: 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a  s numeric.    **
0be0: 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74   affinity, use t
0bf0: 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75  hat. Otherwise u
0c00: 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a  se no affinity..
0c10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
0c20: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
0c30: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
0c40: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0c50: 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20  cAffinity(aff2) 
0c60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0c70: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0c80: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
0c90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0ca0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
0cb0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
0cc0: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
0cd0: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
0ce0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
0cf0: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
0d00: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
0d10: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
0d20: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
0d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0d40: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
0d50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  else{.    /* One
0d60: 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d   side is a colum
0d70: 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  n, the other is 
0d80: 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c  not. Use the col
0d90: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a  umns affinity. *
0da0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66  /.    assert( af
0db0: 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30  f1==0 || aff2==0
0dc0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   );.    return (
0dd0: 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20  aff1 + aff2);.  
0de0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  }.}../*.** pExpr
0df0: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
0e00: 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75   operator.  Retu
0e10: 72 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69  rn the type affi
0e20: 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64  nity that should
0e30: 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74  .** be applied t
0e40: 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  o both operands 
0e50: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74  prior to doing t
0e60: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a  he comparison..*
0e70: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
0e80: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
0e90: 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20  (Expr *pExpr){. 
0ea0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73   char aff;.  ass
0eb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
0ec0: 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_EQ || pExpr->
0ed0: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78  op==TK_IN || pEx
0ee0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pr->op==TK_LT ||
0ef0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0f00: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70  ->op==TK_GT || p
0f10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20  Expr->op==TK_GE 
0f20: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0f30: 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LE ||.         
0f40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
0f50: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
0f60: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20  Expr->pLeft );. 
0f70: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78   aff = sqlite3Ex
0f80: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0f90: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
0fa0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
0fb0: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0fc0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0fd0: 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  y(pExpr->pRight,
0fe0: 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73   aff);.  }.  els
0ff0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65  e if( pExpr->pSe
1000: 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66 66 20  lect ){.    aff 
1010: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
1020: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
1030: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
1040: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
1050: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
1060: 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20 61 66  ( !aff ){.    af
1070: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
1080: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ONE;.  }.  retur
1090: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
10a0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
10b0: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
10c0: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
10d0: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
10e0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
10f0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
1100: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
1110: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
1120: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
1130: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
1140: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
1150: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
1160: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
1170: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
1180: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
1190: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
11a0: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
11b0: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
11c0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
11d0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
11e0: 78 70 72 29 3b 0a 20 20 73 77 69 74 63 68 28 20  xpr);.  switch( 
11f0: 61 66 66 20 29 7b 0a 20 20 20 20 63 61 73 65 20  aff ){.    case 
1200: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
1210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1220: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1230: 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20 20 20 20  _AFF_TEXT:.     
1240: 20 72 65 74 75 72 6e 20 69 64 78 5f 61 66 66 69   return idx_affi
1250: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
1260: 5f 54 45 58 54 3b 0a 20 20 20 20 64 65 66 61 75  _TEXT;.    defau
1270: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1280: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
1290: 63 41 66 66 69 6e 69 74 79 28 69 64 78 5f 61 66  cAffinity(idx_af
12a0: 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a  finity);.  }.}..
12b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12c0: 20 50 35 20 76 61 6c 75 65 20 74 68 61 74 20 73   P5 value that s
12d0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
12e0: 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  r a binary compa
12f0: 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  rison.** opcode 
1300: 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74  (OP_Eq, OP_Ge et
1310: 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  c.) used to comp
1320: 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70  are pExpr1 and p
1330: 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  Expr2..*/.static
1340: 20 75 38 20 62 69 6e 61 72 79 43 6f 6d 70 61 72   u8 binaryCompar
1350: 65 50 35 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP5(Expr *pExpr1
1360: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
1370: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1380: 0a 20 20 75 38 20 61 66 66 20 3d 20 28 63 68 61  .  u8 aff = (cha
1390: 72 29 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  r)sqlite3ExprAff
13a0: 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20  inity(pExpr2);. 
13b0: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
13c0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
13d0: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 6a 75 6d  xpr1, aff) | jum
13e0: 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72  pIfNull;.  retur
13f0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
1400: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1410: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
1420: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
1430: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
1440: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
1450: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1460: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
1470: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
1480: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
1490: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
14a0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
14b0: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
14c0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
14d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
14e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14f0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
1500: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1510: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
1520: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
1530: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
1540: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1550: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
1560: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ype..**.** Argum
1570: 65 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20  ent pRight (but 
1580: 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62  not pLeft) may b
1590: 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  e a null pointer
15a0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
15b0: 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e  ** it is not con
15c0: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c  sidered..*/.Coll
15d0: 53 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61  Seq *sqlite3Bina
15e0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
15f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1600: 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  e, .  Expr *pLef
1610: 74 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67  t, .  Expr *pRig
1620: 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ht.){.  CollSeq 
1630: 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pColl;.  assert
1640: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28  ( pLeft );.  if(
1650: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20   pLeft->flags & 
1660: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
1670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65  .    assert( pLe
1680: 66 74 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  ft->pColl );.   
1690: 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e   pColl = pLeft->
16a0: 70 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  pColl;.  }else i
16b0: 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  f( pRight && pRi
16c0: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
16d0: 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
16e0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
16f0: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70  ->pColl );.    p
1700: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
1710: 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Coll;.  }else{. 
1720: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1730: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1740: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
1750: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1760: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1770: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1780: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17a0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
17b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
17c0: 65 20 6f 70 65 72 61 6e 64 73 20 66 6f 72 20 61  e operands for a
17d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
17e0: 61 74 69 6f 6e 2e 20 20 42 65 66 6f 72 65 0a 2a  ation.  Before.*
17f0: 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  * generating the
1800: 20 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20 6f   code for each o
1810: 70 65 72 61 6e 64 2c 20 73 65 74 20 74 68 65 20  perand, set the 
1820: 45 50 5f 41 6e 79 41 66 66 0a 2a 2a 20 66 6c 61  EP_AnyAff.** fla
1830: 67 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  g on the express
1840: 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 74 20 77  ion so that it w
1850: 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 75  ill be able to u
1860: 73 65 64 20 61 0a 2a 2a 20 63 61 63 68 65 64 20  sed a.** cached 
1870: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 74 68 61  column value tha
1880: 74 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t has previously
1890: 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 0a 2a 2a   undergone an.**
18a0: 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
18b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18c0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 4f 70 65 72   codeCompareOper
18d0: 61 6e 64 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ands(.  Parse *p
18e0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
18f0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
1900: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
1910: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
1920: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  t,      /* The l
1930: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
1940: 20 69 6e 74 20 2a 70 52 65 67 4c 65 66 74 2c 20   int *pRegLeft, 
1950: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 77     /* Register w
1960: 68 65 72 65 20 6c 65 66 74 20 6f 70 65 72 61 6e  here left operan
1970: 64 20 69 73 20 73 74 6f 72 65 64 20 2a 2f 0a 20  d is stored */. 
1980: 20 69 6e 74 20 2a 70 46 72 65 65 4c 65 66 74 2c   int *pFreeLeft,
1990: 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69 73 20     /* Free this 
19a0: 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 64 6f  register when do
19b0: 6e 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52  ne */.  Expr *pR
19c0: 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  ight,     /* The
19d0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
19e0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 52 69 67  /.  int *pRegRig
19f0: 68 74 2c 20 20 20 2f 2a 20 52 65 67 69 73 74 65  ht,   /* Registe
1a00: 72 20 77 68 65 72 65 20 72 69 67 68 74 20 6f 70  r where right op
1a10: 65 72 61 6e 64 20 69 73 20 73 74 6f 72 65 64 20  erand is stored 
1a20: 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 72 65 65 52  */.  int *pFreeR
1a30: 69 67 68 74 20 20 20 2f 2a 20 57 72 69 74 65 20  ight   /* Write 
1a40: 74 65 6d 70 20 72 65 67 69 73 74 65 72 20 66 6f  temp register fo
1a50: 72 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  r right operand 
1a60: 74 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 77 68  there */.){.  wh
1a70: 69 6c 65 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ile( pLeft->op==
1a80: 54 4b 5f 55 50 4c 55 53 20 29 20 70 4c 65 66 74  TK_UPLUS ) pLeft
1a90: 20 3d 20 70 4c 65 66 74 2d 3e 70 4c 65 66 74 3b   = pLeft->pLeft;
1aa0: 0a 20 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  .  pLeft->flags 
1ab0: 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b 0a 20 20  |= EP_AnyAff;.  
1ac0: 2a 70 52 65 67 4c 65 66 74 20 3d 20 73 71 6c 69  *pRegLeft = sqli
1ad0: 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ae0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
1af0: 46 72 65 65 4c 65 66 74 29 3b 0a 20 20 77 68 69  FreeLeft);.  whi
1b00: 6c 65 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  le( pRight->op==
1b10: 54 4b 5f 55 50 4c 55 53 20 29 20 70 52 69 67 68  TK_UPLUS ) pRigh
1b20: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66  t = pRight->pLef
1b30: 74 3b 0a 20 20 70 52 69 67 68 74 2d 3e 66 6c 61  t;.  pRight->fla
1b40: 67 73 20 7c 3d 20 45 50 5f 41 6e 79 41 66 66 3b  gs |= EP_AnyAff;
1b50: 0a 20 20 2a 70 52 65 67 52 69 67 68 74 20 3d 20  .  *pRegRight = 
1b60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1b70: 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
1b80: 68 74 2c 20 70 46 72 65 65 52 69 67 68 74 29 3b  ht, pFreeRight);
1b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1ba0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  te code for a co
1bb0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1bc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1bd0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20   codeCompare(.  
1be0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1bf0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1c00: 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72   (and code gener
1c10: 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a  ating) context *
1c20: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
1c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1c40: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45  t operand */.  E
1c50: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20  xpr *pRight,    
1c60: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70   /* The right op
1c70: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  erand */.  int o
1c80: 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20  pcode,       /* 
1c90: 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  The comparison o
1ca0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69  pcode */.  int i
1cb0: 6e 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20  n1, int in2, /* 
1cc0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
1cd0: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69   operands */.  i
1ce0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1cf0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1d00: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
1d10: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1d20: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
1d30: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
1d40: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
1d50: 20 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20    int p5;.  int 
1d60: 61 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  addr;.  CollSeq 
1d70: 2a 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c  *p4;..  p4 = sql
1d80: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
1d90: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1da0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
1db0: 0a 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f  .  p5 = binaryCo
1dc0: 6d 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70  mpareP5(pLeft, p
1dd0: 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  Right, jumpIfNul
1de0: 6c 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  l);.  addr = sql
1df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70  ite3VdbeAddOp4(p
1e00: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70  Parse->pVdbe, op
1e10: 63 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c  code, in2, dest,
1e20: 20 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20   in1,.          
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43   (void*)p4, P4_C
1e50: 4f 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74  OLLSEQ);.  sqlit
1e60: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70  e3VdbeChangeP5(p
1e70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 35  Parse->pVdbe, p5
1e80: 29 3b 0a 20 20 69 66 28 20 70 35 20 26 20 53 51  );.  if( p5 & SQ
1e90: 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 29 7b  LITE_AFF_MASK ){
1ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1eb0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1ec0: 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 31 2c  nge(pParse, in1,
1ed0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1ee0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1ef0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1f00: 69 6e 32 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  in2, 1);.  }.  r
1f10: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1f20: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
1f30: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1f40: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1f50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1f60: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1f70: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1f80: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1f90: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  e3_malloc().  Th
1fa0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1fb0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
1fc0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1fd0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
1fe0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
1ff0: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
2000: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
2010: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
2020: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
2030: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
2040: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
2050: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
2060: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2070: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
2080: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78  n opcode */.  Ex
2090: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
20a0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70        /* Left op
20b0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
20c0: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  *pRight,        
20d0: 20 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72     /* Right oper
20e0: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  and */.  const T
20f0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20  oken *pToken    
2100: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b   /* Argument tok
2110: 65 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  en */.){.  Expr 
2120: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
2130: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
2140: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45  ero(db, sizeof(E
2150: 78 70 72 29 29 3b 0a 20 20 69 66 28 20 70 4e 65  xpr));.  if( pNe
2160: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  w==0 ){.    /* W
2170: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
2180: 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61  , delete pLeft a
2190: 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65  nd pRight. Expre
21a0: 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f  ssions passed to
21b0: 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75   .    ** this fu
21c0: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61  nction must alwa
21d0: 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ys be allocated 
21e0: 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72  with sqlite3Expr
21f0: 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20  () for this .   
2200: 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20   ** reason. .   
2210: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
2220: 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29  xprDelete(pLeft)
2230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2240: 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b  rDelete(pRight);
2250: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2260: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
2270: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66  op;.  pNew->pLef
2280: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65  t = pLeft;.  pNe
2290: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  w->pRight = pRig
22a0: 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67  ht;.  pNew->iAgg
22b0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f   = -1;.  if( pTo
22c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
22d0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
22e0: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  0 );.    pNew->s
22f0: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
2300: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
2310: 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29  else if( pLeft )
2320: 7b 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  {.    if( pRight
2330: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2340: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
2350: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
2360: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
2370: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
2380: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
2390: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
23a0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
23b0: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
23c0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
23d0: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
23e0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
23f0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  }.    if( pLeft-
2400: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
2410: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
2420: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
2430: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
2440: 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20      pNew->pColl 
2450: 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  = pLeft->pColl;.
2460: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
2470: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
2480: 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  t(pNew);.  retur
2490: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
24a0: 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69   Works like sqli
24b0: 74 65 33 45 78 70 72 28 29 20 65 78 63 65 70 74  te3Expr() except
24c0: 20 74 68 61 74 20 69 74 20 74 61 6b 65 73 20 61   that it takes a
24d0: 6e 20 65 78 74 72 61 20 50 61 72 73 65 2a 0a 2a  n extra Parse*.*
24e0: 2a 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 6e  * argument and n
24f0: 6f 74 69 66 69 65 73 20 74 68 65 20 61 73 73 6f  otifies the asso
2500: 63 69 61 74 65 64 20 63 6f 6e 6e 65 63 74 69 6f  ciated connectio
2510: 6e 20 6f 62 6a 65 63 74 20 69 66 20 6d 61 6c 6c  n object if mall
2520: 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 45 78 70  oc fails..*/.Exp
2530: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
2540: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2550: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
2560: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2570: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
2580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2590: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
25a0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
25b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25c0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
25d0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
25e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
25f0: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
2600: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
2610: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
2620: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
2630: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2640: 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
2650: 20 6f 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67   op, pLeft, pRig
2660: 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a  ht, pToken);.}..
2670: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67  /*.** When doing
2680: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
2690: 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64 65   you can include
26a0: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
26b0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ression.** that 
26c0: 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20  look like this: 
26d0: 20 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65    #1 #2 ...  The
26e0: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
26f0: 6f 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69  o registers.** i
2700: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
2710: 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68  chine.  #N is th
2720: 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e  e N-th register.
2730: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2740: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
2750: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 64   the parser to d
2760: 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74  eal with on of t
2770: 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49  hose terms..** I
2780: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65  t immediately ge
2790: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
27a0: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
27b0: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  in a memory loca
27c0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74  tion..** The ret
27d0: 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  urns an expressi
27e0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64  on that will cod
27f0: 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
2800: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74   value from.** t
2810: 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  hat memory locat
2820: 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ion as needed..*
2830: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52  /.Expr *sqlite3R
2840: 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72 73  egisterExpr(Pars
2850: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
2860: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62   *pToken){.  Vdb
2870: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2880: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b  Vdbe;.  Expr *p;
2890: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
28a0: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
28b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28c0: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
28d0: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
28e0: 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  or", pToken);.  
28f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2900: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2910: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  _NULL, 0, 0, 0);
2920: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20  .  }.  if( v==0 
2930: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20  ) return 0;.  p 
2940: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2950: 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54  Parse, TK_REGIST
2960: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
2970: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2980: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
2990: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
29a0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 69 54 61   */.  }.  p->iTa
29b0: 62 6c 65 20 3d 20 61 74 6f 69 28 28 63 68 61 72  ble = atoi((char
29c0: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
29d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
29e0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
29f0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
2a00: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
2a10: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
2a20: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
2a30: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
2a40: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
2a50: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
2a60: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
2a70: 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  And(sqlite3 *db,
2a80: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
2a90: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
2aa0: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
2ab0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
2ac0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
2ad0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
2ae0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
2af0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2b00: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2b10: 20 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20   TK_AND, pLeft, 
2b20: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a  pRight, 0);.  }.
2b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2b40: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
2b50: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
2b60: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
2b70: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
2b80: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
2b90: 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f  en tokens..*/.vo
2ba0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  id sqlite3ExprSp
2bb0: 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  an(Expr *pExpr, 
2bc0: 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f  Token *pLeft, To
2bd0: 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  ken *pRight){.  
2be0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d  assert( pRight!=
2bf0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c00: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  Left!=0 );.  if(
2c10: 20 70 45 78 70 72 20 26 26 20 70 52 69 67 68 74   pExpr && pRight
2c20: 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20  ->z && pLeft->z 
2c30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2c40: 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20  Left->dyn==0 || 
2c50: 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e  pLeft->z[pLeft->
2c60: 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  n]==0 );.    if(
2c70: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26   pLeft->dyn==0 &
2c80: 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30  & pRight->dyn==0
2c90: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
2ca0: 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d  >span.z = pLeft-
2cb0: 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  >z;.      pExpr-
2cc0: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
2cd0: 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a  ->n + (pRight->z
2ce0: 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20   - pLeft->z);.  
2cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d00: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  Expr->span.z = 0
2d10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2d20: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2d30: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2d40: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
2d50: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
2d60: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
2d70: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2d80: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72  ExprFunction(Par
2d90: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2da0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
2db0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
2dc0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73  xpr *pNew;.  ass
2dd0: 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b 0a 20  ert( pToken );. 
2de0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
2df0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
2e00: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45  se->db, sizeof(E
2e10: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
2e20: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
2e30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2e40: 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76  te(pList); /* Av
2e50: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
2e60: 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  ry when malloc f
2e70: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
2e80: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
2e90: 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49  ->op = TK_FUNCTI
2ea0: 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  ON;.  pNew->pLis
2eb0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
2ec0: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
2ed0: 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74  ==0 );.  pNew->t
2ee0: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
2ef0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
2f00: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20 20 73  New->token;..  s
2f10: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
2f20: 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72 65 74  ght(pNew);.  ret
2f30: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
2f40: 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69  ** Assign a vari
2f50: 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61  able number to a
2f60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
2f70: 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64  t encodes a wild
2f80: 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  card.** in the o
2f90: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
2fa0: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  ement.  .**.** W
2fb0: 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74  ildcards consist
2fc0: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
2fd0: 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  "?" are assigned
2fe0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2ff0: 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tial.** variable
3000: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   number..**.** W
3010: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
3020: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20  form "?nnn" are 
3030: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d  assigned the num
3040: 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d  ber "nnn".  We m
3050: 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e  ake.** sure "nnn
3060: 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20  " is not too be 
3070: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
3080: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
3090: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
30a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
30b0: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
30c0: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
30d0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
30e0: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20  the form ":aaa" 
30f0: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
3100: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
3110: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
3120: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
3130: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
3140: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
3150: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
3160: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
3170: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
3180: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61  he next sequenia
3190: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
31a0: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
31b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
31c0: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
31d0: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
31e0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
31f0: 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  {.  Token *pToke
3200: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
3210: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
3220: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
3230: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65   return;.  pToke
3240: 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  n = &pExpr->toke
3250: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  n;.  assert( pTo
3260: 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61  ken->n>=1 );.  a
3270: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a  ssert( pToken->z
3280: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
3290: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30   pToken->z[0]!=0
32a0: 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e   );.  if( pToken
32b0: 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ->n==1 ){.    /*
32c0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
32d0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
32e0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
32f0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
3300: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
3310: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61   = ++pParse->nVa
3320: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  r;.  }else if( p
3330: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27  Token->z[0]=='?'
3340: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
3350: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
3360: 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74  "?nnn".  Convert
3370: 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74   "nnn" to an int
3380: 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20  eger and.    ** 
3390: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
33a0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
33b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
33c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
33d0: 69 20 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29  i = atoi((char*)
33e0: 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a  &pToken->z[1]);.
33f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
3400: 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
3410: 73 65 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20  se( i==1 );.    
3420: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
3430: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
3440: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
3450: 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 74  MBER]-1 );.    t
3460: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
3470: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
3480: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
3490: 42 45 52 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  BER] );.    if( 
34a0: 69 3c 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69  i<1 || i>db->aLi
34b0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
34c0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
34d0: 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
34e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
34f0: 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d  e, "variable num
3500: 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77  ber must be betw
3510: 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c  een ?1 and ?%d",
3520: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
3530: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
3540: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
3550: 45 52 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ER]);.    }.    
3560: 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56  if( i>pParse->nV
3570: 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ar ){.      pPar
3580: 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20  se->nVar = i;.  
3590: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
35a0: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66   /* Wildcards of
35b0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
35c0: 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65 75   or "$aaa".  Reu
35d0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
35e0: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  able.    ** numb
35f0: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
3600: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
3610: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
3620: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
3630: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
3640: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
3650: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
3660: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
3670: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   */.    int i, n
3680: 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e  ;.    n = pToken
3690: 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ->n;.    for(i=0
36a0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72  ; i<pParse->nVar
36b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
36c0: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
36d0: 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61 72    if( (pE = pPar
36e0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d  se->apVarExpr[i]
36f0: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )!=0.          &
3700: 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e  & pE->token.n==n
3710: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65  .          && me
3720: 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  mcmp(pE->token.z
3730: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d  , pToken->z, n)=
3740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
3750: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  xpr->iTable = pE
3760: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
3770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3780: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
3790: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
37a0: 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  pr ){.      pExp
37b0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
37c0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20  arse->nVar;.    
37d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
37e0: 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e  arExpr>=pParse->
37f0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20  nVarExprAlloc-1 
3800: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
3810: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
3820: 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   += pParse->nVar
3830: 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a  ExprAlloc + 10;.
3840: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3850: 61 70 56 61 72 45 78 70 72 20 3d 0a 20 20 20 20  apVarExpr =.    
3860: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3870: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 0a  bReallocOrFree(.
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
3890: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
38a0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
38b0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
38c0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
38d0: 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50  rAlloc*sizeof(pP
38e0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
38f0: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
3900: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3910: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
3920: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
3930: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
3940: 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29  ->apVarExpr!=0 )
3950: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
3960: 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72  ->apVarExpr[pPar
3970: 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20  se->nVarExpr++] 
3980: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
3990: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
39a0: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
39b0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
39c0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
39d0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
39e0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
39f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3a00: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
3a10: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
3a20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3a30: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
3a40: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
3a50: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
3a60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3a70: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
3a80: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
3a90: 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79    if( p->span.dy
3aa0: 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  n ) sqlite3_free
3ab0: 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e  ((char*)p->span.
3ac0: 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  z);.  if( p->tok
3ad0: 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 33  en.dyn ) sqlite3
3ae0: 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  _free((char*)p->
3af0: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  token.z);.  sqli
3b00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
3b10: 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74  >pLeft);.  sqlit
3b20: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
3b30: 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74  pRight);.  sqlit
3b40: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
3b50: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71  (p->pList);.  sq
3b60: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3b70: 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  e(p->pSelect);. 
3b80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
3b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45  ;.}../*.** The E
3ba0: 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20  xpr.token field 
3bb0: 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e  might be a strin
3bc0: 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69  g literal that i
3bd0: 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20  s quoted..** If 
3be0: 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71  so, remove the q
3bf0: 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a  uotation marks..
3c00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3c10: 65 71 75 6f 74 65 45 78 70 72 28 73 71 6c 69 74  equoteExpr(sqlit
3c20: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
3c30: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41  {.  if( ExprHasA
3c40: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
3c50: 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20  _Dequoted) ){.  
3c60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
3c70: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
3c80: 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b  p, EP_Dequoted);
3c90: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
3ca0: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dyn==0 ){.    sq
3cb0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64  lite3TokenCopy(d
3cc0: 62 2c 20 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70  b, &p->token, &p
3cd0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20  ->token);.  }.  
3ce0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28  sqlite3Dequote((
3cf0: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
3d00: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
3d10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
3d20: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
3d30: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
3d40: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
3d50: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3d60: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
3d70: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
3d80: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
3d90: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
3da0: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
3db0: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
3dc0: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
3dd0: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
3de0: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
3df0: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
3e00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
3e10: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
3e20: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
3e30: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
3e40: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
3e50: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
3e60: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
3e70: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
3e80: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
3e90: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
3ea0: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
3eb0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
3ec0: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
3ed0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
3ee0: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
3ef0: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
3f00: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
3f10: 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70  plicated..*/.Exp
3f20: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
3f30: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
3f40: 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  xpr *p){.  Expr 
3f50: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
3f60: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3f70: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
3f80: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
3f90: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
3fa0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3fb0: 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70  rn 0;.  memcpy(p
3fc0: 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a  New, p, sizeof(*
3fd0: 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d  pNew));.  if( p-
3fe0: 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20  >token.z!=0 ){. 
3ff0: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
4000: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 44   = (u8*)sqlite3D
4010: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
4020: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  ar*)p->token.z, 
4030: 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  p->token.n);.   
4040: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e   pNew->token.dyn
4050: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
4060: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
4070: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20  >token.z==0 );. 
4080: 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e   }.  pNew->span.
4090: 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  z = 0;.  pNew->p
40a0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
40b0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
40c0: 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ft);.  pNew->pRi
40d0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
40e0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
40f0: 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ht);.  pNew->pLi
4100: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
4110: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
4120: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
4130: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
4140: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
4150: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  >pSelect);.  ret
4160: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64  urn pNew;.}.void
4170: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
4180: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  y(sqlite3 *db, T
4190: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e  oken *pTo, Token
41a0: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
41b0: 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74  pTo->dyn ) sqlit
41c0: 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70  e3_free((char*)p
41d0: 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46  To->z);.  if( pF
41e0: 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54  rom->z ){.    pT
41f0: 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b  o->n = pFrom->n;
4200: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75  .    pTo->z = (u
4210: 38 2a 29 73 71 6c 69 74 65 33 44 62 53 74 72 4e  8*)sqlite3DbStrN
4220: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
4230: 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e  From->z, pFrom->
4240: 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e  n);.    pTo->dyn
4250: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
4260: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20     pTo->z = 0;. 
4270: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
4280: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4290: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
42a0: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
42b0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
42c0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
42d0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
42e0: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
42f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
4300: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
4310: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
4320: 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
4330: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
4340: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
4350: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 43 75   0;.  pNew->iECu
4360: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77  rsor = 0;.  pNew
4370: 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e  ->nExpr = pNew->
4380: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70  nAlloc = p->nExp
4390: 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70  r;.  pNew->a = p
43a0: 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  Item = sqlite3Db
43b0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20 70  MallocRaw(db,  p
43c0: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
43d0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
43e0: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
43f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
4400: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
4410: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
4420: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
4430: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
4440: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
4450: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
4460: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c   Expr *pNewExpr,
4470: 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20   *pOldExpr;.    
4480: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
4490: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
44a0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
44b0: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
44c0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
44d0: 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  ( pOldExpr->span
44e0: 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70  .z!=0 && pNewExp
44f0: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  r ){.      /* Al
4500: 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79  ways make a copy
4510: 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72   of the span for
4520: 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65   top-level expre
4530: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20  ssions in the.  
4540: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
4550: 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67  n list.  The log
4560: 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f  ic in SELECT pro
4570: 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74  cessing that det
4580: 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  ermines.      **
4590: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
45a0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
45b0: 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68  ult set needs th
45c0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  is information *
45d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
45e0: 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 4e  okenCopy(db, &pN
45f0: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
4600: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
4610: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
4620: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
4630: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
4640: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
4650: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
4660: 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  pan.z==0.       
4670: 20 20 20 20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c       || db->mall
4680: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
4690: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
46a0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
46b0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
46c0: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
46d0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
46e0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
46f0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67  .    pItem->isAg
4700: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73  g = pOldItem->is
4710: 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Agg;.    pItem->
4720: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
4730: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
4740: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
4750: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
4760: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
4770: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
4780: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
4790: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
47a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
47b0: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
47c0: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
47d0: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
47e0: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
47f0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
4800: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
4810: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
4820: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
4830: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4840: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
4850: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4860: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
4870: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
4880: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4890: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
48a0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71  te3SrcListDup(sq
48b0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
48c0: 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  st *p){.  SrcLis
48d0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
48e0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
48f0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4900: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
4910: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
4920: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
4930: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
4940: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
4950: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
4960: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42  MallocRaw(db, nB
4970: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
4980: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
4990: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
49a0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
49b0: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
49c0: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
49d0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
49e0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
49f0: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
4a00: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
4a10: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
4a20: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
4a30: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
4a40: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
4a50: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
4a60: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4a70: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  , pOldItem->zDat
4a80: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
4a90: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
4aa0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
4ab0: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  , pOldItem->zNam
4ac0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
4ad0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
4ae0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
4af0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
4b00: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4b10: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
4b20: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
4b30: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
4b40: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
4b50: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
4b60: 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61  ewItem->isPopula
4b70: 74 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ted = pOldItem->
4b80: 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20  isPopulated;.   
4b90: 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d   pTab = pNewItem
4ba0: 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  ->pTab = pOldIte
4bb0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
4bc0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
4bd0: 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
4be0: 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d   }.    pNewItem-
4bf0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
4c00: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
4c10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
4c20: 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  t);.    pNewItem
4c30: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
4c40: 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  xprDup(db, pOldI
4c50: 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70  tem->pOn);.    p
4c60: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
4c70: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
4c80: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
4c90: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
4ca0: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
4cb0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
4cc0: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
4cd0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
4ce0: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
4cf0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
4d00: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
4d10: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
4d20: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
4d30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4d40: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
4d50: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
4d60: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
4d70: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
4d80: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
4d90: 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  Id = pNew->nAllo
4da0: 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  c = p->nId;.  pN
4db0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44  ew->a = sqlite3D
4dc0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
4dd0: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
4de0: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
4df0: 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  New->a==0 ){.   
4e00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
4e10: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
4e20: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
4e30: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
4e40: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
4e50: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
4e60: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
4e70: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
4e80: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
4e90: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
4ea0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
4eb0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
4ec0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
4ed0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
4ee0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
4ef0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
4f00: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
4f10: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
4f20: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
4f30: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
4f40: 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
4f50: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
4f60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4f70: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
4f80: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
4f90: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
4fa0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
4fb0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69   0;.  pNew->isDi
4fc0: 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
4fd0: 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e  stinct;.  pNew->
4fe0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
4ff0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
5000: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e  p->pEList);.  pN
5010: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
5020: 65 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c  e3SrcListDup(db,
5030: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65   p->pSrc);.  pNe
5040: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
5050: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
5060: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
5070: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
5080: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
5090: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
50a0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  );.  pNew->pHavi
50b0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
50c0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  Dup(db, p->pHavi
50d0: 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ng);.  pNew->pOr
50e0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
50f0: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
5100: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
5110: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
5120: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
5130: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
5140: 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  up(db, p->pPrior
5150: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
5160: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
5170: 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  up(db, p->pLimit
5180: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  );.  pNew->pOffs
5190: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
51a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  Dup(db, p->pOffs
51b0: 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  et);.  pNew->iLi
51c0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
51d0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
51e0: 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76    pNew->isResolv
51f0: 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76  ed = p->isResolv
5200: 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67  ed;.  pNew->isAg
5210: 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
5220: 70 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d  pNew->usesEphm =
5230: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61   0;.  pNew->disa
5240: 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b  llowOrderBy = 0;
5250: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d  .  pNew->pRightm
5260: 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ost = 0;.  pNew-
5270: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
5280: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
5290: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
52a0: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
52b0: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
52c0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  1;.  return pNew
52d0: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
52e0: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
52f0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
5300: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73  Select *p){.  as
5310: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
5320: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
5330: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
5340: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
5350: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
5360: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
5370: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
5380: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
5390: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
53a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
53b0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
53c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
53d0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
53e0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
53f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
5400: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
5410: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
5420: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
5430: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
5440: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
5450: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
5460: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
5470: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
5480: 64 65 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ded */.  Token *
5490: 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  pName           
54a0: 20 2f 2a 20 41 53 20 6b 65 79 77 6f 72 64 20 66   /* AS keyword f
54b0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
54c0: 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  n */.){.  sqlite
54d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
54e0: 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  db;.  if( pList=
54f0: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
5500: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5510: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
5520: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
5530: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
5540: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
5550: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mem;.    }.    a
5560: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41  ssert( pList->nA
5570: 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  lloc==0 );.  }. 
5580: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   if( pList->nAll
5590: 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oc<=pList->nExpr
55a0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
55b0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
55c0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69  .    int n = pLi
55d0: 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34  st->nAlloc*2 + 4
55e0: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
55f0: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
5600: 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f  List->a, n*sizeo
5610: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
5620: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
5630: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
5640: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
5650: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20  ist->a = a;.    
5660: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
5670: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
5680: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a   pList->a!=0 );.
5690: 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70    if( pExpr || p
56a0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75  Name ){.    stru
56b0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
56c0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
56d0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
56e0: 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ++];.    memset(
56f0: 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
5700: 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70  (*pItem));.    p
5710: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
5720: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
5730: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
5740: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
5750: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
5760: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
5770: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
5780: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
5790: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
57a0: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
57b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
57c0: 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e(pExpr);.  sqli
57d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
57e0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  e(pList);.  retu
57f0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
5800: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5810: 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e   list pEList con
5820: 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  tains more than 
5830: 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c  iLimit elements,
5840: 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72  .** leave an err
5850: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
5860: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
5870: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
5880: 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73  ckLength(.  Pars
5890: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
58a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20  rList *pEList,. 
58b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62   const char *zOb
58c0: 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78  ject.){.  int mx
58d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
58e0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
58f0: 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65  IT_COLUMN];.  te
5900: 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26  stcase( pEList &
5910: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
5920: 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73  =mx );.  testcas
5930: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
5940: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31  ist->nExpr==mx+1
5950: 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
5960: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
5970: 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  r>mx ){.    sqli
5980: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5990: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
59a0: 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f  lumns in %s", zO
59b0: 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  bject);.  }.}...
59c0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
59d0: 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
59e0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 29  , heightOfExpr()
59f0: 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69  , heightOfExprLi
5a00: 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67  st().** and heig
5a10: 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61 72  htOfSelect(), ar
5a20: 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  e used to determ
5a30: 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ine the maximum 
5a40: 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79  height.** of any
5a50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5a60: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
5a70: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61 73  he structure pas
5a80: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66 69  sed as the.** fi
5a90: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
5aa0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78 69  .** If this maxi
5ab0: 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67 72  mum height is gr
5ac0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
5ad0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f 69  urrent value poi
5ae0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e  nted.** to by pn
5af0: 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63 6f  Height, the seco
5b00: 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74 68  nd parameter, th
5b10: 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68 74  en set *pnHeight
5b20: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75   to that.** valu
5b30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5b40: 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 45  d heightOfExpr(E
5b50: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  xpr *p, int *pnH
5b60: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
5b70: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 48  ){.    if( p->nH
5b80: 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74 20  eight>*pnHeight 
5b90: 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67  ){.      *pnHeig
5ba0: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
5bb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
5bc0: 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f  tic void heightO
5bd0: 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  fExprList(ExprLi
5be0: 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  st *p, int *pnHe
5bf0: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
5c00: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
5c10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
5c20: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
5c30: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
5c40: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e  ->a[i].pExpr, pn
5c50: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  Height);.    }. 
5c60: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
5c70: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
5c80: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a  Select *p, int *
5c90: 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28  pnHeight){.  if(
5ca0: 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74   p ){.    height
5cb0: 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  OfExpr(p->pWhere
5cc0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
5cd0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
5ce0: 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69 67  >pHaving, pnHeig
5cf0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5d00: 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  fExpr(p->pLimit,
5d10: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5d20: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5d30: 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67 68  pOffset, pnHeigh
5d40: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
5d50: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
5d60: 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  st, pnHeight);. 
5d70: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c     heightOfExprL
5d80: 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c  ist(p->pGroupBy,
5d90: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
5da0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
5db0: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e  (p->pOrderBy, pn
5dc0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
5dd0: 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70  ghtOfSelect(p->p
5de0: 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74 29  Prior, pnHeight)
5df0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
5e00: 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65 69  et the Expr.nHei
5e10: 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e 20  ght variable in 
5e20: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
5e30: 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61  ssed as an .** a
5e40: 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72  rgument. An expr
5e50: 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63  ession with no c
5e60: 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c  hildren, Expr.pL
5e70: 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e  ist or .** Expr.
5e80: 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20 68  pSelect member h
5e90: 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20 31  as a height of 1
5ea0: 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70 72  . Any other expr
5eb0: 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20  ession.** has a 
5ec0: 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f 20  height equal to 
5ed0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
5ee0: 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ht of any other 
5ef0: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 45  .** referenced E
5f00: 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2f  xpr plus one..*/
5f10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
5f20: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
5f30: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5f40: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5f50: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
5f60: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
5f70: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
5f80: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
5f90: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  .  heightOfExprL
5fa0: 69 73 74 28 70 2d 3e 70 4c 69 73 74 2c 20 26 6e  ist(p->pList, &n
5fb0: 48 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68  Height);.  heigh
5fc0: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 53 65  tOfSelect(p->pSe
5fd0: 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  lect, &nHeight);
5fe0: 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20  .  p->nHeight = 
5ff0: 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a  nHeight + 1;.}..
6000: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6010: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
6020: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
6030: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
6040: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
6050: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
6060: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
6070: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
6080: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
6090: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
60a0: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
60b0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
60c0: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
60d0: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
60e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
60f0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
6100: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
6110: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
6120: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
6130: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
6140: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
6150: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6160: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
6170: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
6180: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
6190: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
61a0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
61b0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
61c0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
61d0: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
61e0: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
61f0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
6200: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
6210: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
6220: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
6230: 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
6240: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
6250: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d  ite3_free(pItem-
6260: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  >zName);.  }.  s
6270: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73  qlite3_free(pLis
6280: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
6290: 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  _free(pList);.}.
62a0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
62b0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
62c0: 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20   Call xFunc for 
62d0: 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65  each node visite
62e0: 64 2e 20 20 78 46 75 6e 63 0a 2a 2a 20 69 73 20  d.  xFunc.** is 
62f0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 6f  called on the no
6300: 64 65 20 62 65 66 6f 72 65 20 78 46 75 6e 63 20  de before xFunc 
6310: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
6320: 20 6e 6f 64 65 73 20 63 68 69 6c 64 72 65 6e 2e   nodes children.
6330: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
6340: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75  n value from xFu
6350: 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  nc determines wh
6360: 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20 77  ether the tree w
6370: 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a  alk continues..*
6380: 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e  * 0 means contin
6390: 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74  ue walking the t
63a0: 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f  ree.  1 means do
63b0: 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72   not walk childr
63c0: 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72  en.** of the cur
63d0: 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f  rent node but co
63e0: 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c  ntinue with sibl
63f0: 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61  ings.  2 means a
6400: 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72  bandon.** the tr
6410: 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65  ee walk complete
6420: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ly..**.** The re
6430: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
6440: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6450: 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65  1 to abandon the
6460: 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e   tree walk.** an
6470: 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  d 0 to continue.
6480: 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20  .**.** NOTICE:  
6490: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
64a0: 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20  s *not* descend 
64b0: 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e  into subqueries.
64c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
64d0: 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72  alkExprList(Expr
64e0: 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28  List *, int (*)(
64f0: 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20  void *, Expr*), 
6500: 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20  void *);.static 
6510: 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65  int walkExprTree
6520: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
6530: 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a  t (*xFunc)(void*
6540: 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70  ,Expr*), void *p
6550: 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Arg){.  int rc;.
6560: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
6570: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20   return 0;.  rc 
6580: 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c  = (*xFunc)(pArg,
6590: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72   pExpr);.  if( r
65a0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
65b0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78  walkExprTree(pEx
65c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63  pr->pLeft, xFunc
65d0: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
65e0: 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   1;.    if( walk
65f0: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e  ExprTree(pExpr->
6600: 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70  pRight, xFunc, p
6610: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Arg) ) return 1;
6620: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
6630: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
6640: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
6650: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
6660: 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a  .  return rc>1;.
6670: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61  }../*.** Call wa
6680: 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72  lkExprTree() for
6690: 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
66a0: 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a  n in list p..*/.
66b0: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
66c0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
66d0: 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63   *p, int (*xFunc
66e0: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
66f0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
6700: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
6710: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6720: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20  pItem;.  if( !p 
6730: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
6740: 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49  r(i=p->nExpr, pI
6750: 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69  tem=p->a; i>0; i
6760: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
6770: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
6780: 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ee(pItem->pExpr,
6790: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
67a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
67b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
67c0: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
67d0: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
67e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53   expression in S
67f0: 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63  elect p, not inc
6800: 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73  luding.** expres
6810: 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70  sions that are p
6820: 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63  art of sub-selec
6830: 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63  ts in any FROM c
6840: 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d  lause or the LIM
6850: 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20  IT.** or OFFSET 
6860: 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f  expressions...*/
6870: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
6880: 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63  SelectExpr(Selec
6890: 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e  t *p, int (*xFun
68a0: 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  c)(void *, Expr*
68b0: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
68c0: 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70    walkExprList(p
68d0: 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c  ->pEList, xFunc,
68e0: 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78   pArg);.  walkEx
68f0: 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65  prTree(p->pWhere
6900: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
6910: 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70    walkExprList(p
6920: 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e  ->pGroupBy, xFun
6930: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
6940: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76  ExprTree(p->pHav
6950: 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ing, xFunc, pArg
6960: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  );.  walkExprLis
6970: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78  t(p->pOrderBy, x
6980: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 69  Func, pArg);.  i
6990: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
69a0: 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78      walkSelectEx
69b0: 70 72 28 70 2d 3e 70 50 72 69 6f 72 2c 20 78 46  pr(p->pPrior, xF
69c0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  unc, pArg);.  }.
69d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
69e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
69f0: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
6a00: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
6a10: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
6a20: 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61  *.** pArg is rea
6a30: 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
6a40: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66   an integer.  If
6a50: 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20   we can tell by 
6a60: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45  looking.** at pE
6a70: 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70  xpr that the exp
6a80: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
6a90: 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e  tains pExpr is n
6aa0: 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ot a constant.**
6ab0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
6ac0: 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30  n set *pArg to 0
6ad0: 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f   and return 2 to
6ae0: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
6af0: 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45  e walk..** If pE
6b00: 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f  xpr does does no
6b10: 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65  t disqualify the
6b20: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
6b30: 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e   being a constan
6b40: 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74  t.** then do not
6b50: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  hing..**.** Afte
6b60: 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68  r walking the wh
6b70: 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20  ole tree, if no 
6b80: 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20  nodes are found 
6b90: 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a  that disqualify.
6ba0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
6bb0: 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n as constant, t
6bc0: 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68  hen we assume th
6bd0: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
6be0: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e  on.** is constan
6bf0: 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  t.  See sqlite3E
6c00: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
6c10: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
6c20: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
6c30: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
6c40: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69  deIsConstant(voi
6c50: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
6c60: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 2a 70 4e  Expr){.  int *pN
6c70: 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 0a   = (int*)pArg;..
6c80: 20 20 2f 2a 20 49 66 20 2a 70 41 72 67 20 69 73    /* If *pArg is
6c90: 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   3 then any term
6ca0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
6cb0: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
6cc0: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
6cd0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
6ce0: 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61  of a join disqua
6cf0: 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65  lifies the expre
6d00: 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20  ssion.  ** from 
6d10: 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
6d20: 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20   constant. */.  
6d30: 69 66 28 20 28 2a 70 4e 29 3d 3d 33 20 26 26 20  if( (*pN)==3 && 
6d40: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
6d50: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
6d60: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70  mJoin) ){.    *p
6d70: 4e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  N = 0;.    retur
6d80: 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  n 2;.  }..  swit
6d90: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
6da0: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
6db0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
6dc0: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
6dd0: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
6de0: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
6df0: 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d    ** and *pArg==
6e00: 32 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  2 */.    case TK
6e10: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20  _FUNCTION:.     
6e20: 20 69 66 28 20 28 2a 70 4e 29 3d 3d 32 20 29 20   if( (*pN)==2 ) 
6e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6e40: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
6e50: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
6e60: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
6e70: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
6e80: 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_DOT:.    case
6e90: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
6ea0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
6eb0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65  G_COLUMN:.#ifnde
6ec0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6ed0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
6ee0: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
6ef0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
6f00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
6f10: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
6f20: 45 43 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ECT );.      tes
6f30: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
6f40: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23  ==TK_EXISTS );.#
6f50: 65 6e 64 69 66 0a 20 20 20 20 20 20 74 65 73 74  endif.      test
6f60: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
6f70: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
6f80: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
6f90: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
6fa0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6fb0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
6fc0: 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  DOT );.      tes
6fd0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
6fe0: 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
6ff0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
7000: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
7010: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
7020: 0a 20 20 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a  .      *pN = 0;.
7030: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
7040: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
7050: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
7060: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
7070: 20 20 20 20 2a 70 4e 20 3d 20 30 3b 0a 20 20 20      *pN = 0;.   
7080: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
7090: 20 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75       }.    defau
70a0: 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
70b0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
70c0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
70d0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
70e0: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
70f0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
7100: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
7110: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
7120: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
7130: 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  calls..**.** For
7140: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
7150: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
7160: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
7170: 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
7180: 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
7190: 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
71a0: 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
71b0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
71c0: 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
71d0: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
71e0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
71f0: 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20  tant(Expr *p){. 
7200: 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 31   int isConst = 1
7210: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
7220: 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  (p, exprNodeIsCo
7230: 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74  nstant, &isConst
7240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f  );.  return isCo
7250: 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  nst;.}../*.** Wa
7260: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
7270: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
7280: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
7290: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
72a0: 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f  * that does no o
72b0: 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68  riginate from th
72c0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
72d0: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e  auses of a join.
72e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
72f0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
7300: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
7310: 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73  n calls or terms
7320: 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f   from.** an ON o
7330: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
7340: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
7350: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
7360: 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
7370: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 33 3b  int isConst = 3;
7380: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
7390: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
73a0: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
73b0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
73c0: 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  st!=0;.}../*.** 
73d0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
73e0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
73f0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
7400: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
7410: 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69 6f  .** or a functio
7420: 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e 73  n call with cons
7430: 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
7440: 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69 66   Return and 0 if
7450: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e   there.** are an
7460: 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  y variables..**.
7470: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
7480: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
7490: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
74a0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
74b0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
74c0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
74d0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
74e0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
74f0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
7500: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
7510: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
7520: 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63  IsConstantOrFunc
7530: 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  tion(Expr *p){. 
7540: 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 32   int isConst = 2
7550: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
7560: 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  (p, exprNodeIsCo
7570: 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74  nstant, &isConst
7580: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f  );.  return isCo
7590: 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nst!=0;.}../*.**
75a0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
75b0: 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e  on p codes a con
75c0: 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68  stant integer th
75d0: 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  at is small enou
75e0: 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  gh.** to fit in 
75f0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
7600: 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70  , return 1 and p
7610: 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ut the value of 
7620: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  the integer.** i
7630: 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74  n *pValue.  If t
7640: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7650: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
7660: 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  or if it is too 
7670: 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  big.** to fit in
7680: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
7690: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
76a0: 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56   0 and leave *pV
76b0: 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  alue unchanged..
76c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
76d0: 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
76e0: 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
76f0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ){.  switch( p->
7700: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
7710: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
7720: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
7730: 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29 70 2d  tInt32((char*)p-
7740: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65  >token.z, pValue
7750: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
7760: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7780: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
7790: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LUS: {.      ret
77a0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 49  urn sqlite3ExprI
77b0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
77c0: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
77d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
77e0: 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INUS: {.      in
77f0: 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t v;.      if( s
7800: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
7810: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76  ger(p->pLeft, &v
7820: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) ){.        *pV
7830: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
7840: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7850: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
7870: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
7880: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
7890: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
78a0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
78b0: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
78c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
78d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
78e0: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
78f0: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
7900: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
7910: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
7920: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
7930: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
7940: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
7950: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
7960: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
7970: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
7980: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
7990: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
79a0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
79b0: 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  umn of the form 
79c0: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
79d0: 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a  just Z, look up.
79e0: 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20  ** that name in 
79f0: 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63  the set of sourc
7a00: 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  e tables in pSrc
7a10: 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68  List and make th
7a20: 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72  e pExpr .** expr
7a30: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65  ession node refe
7a40: 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73  r back to that s
7a50: 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  ource column.  T
7a60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
7a70: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
7a80: 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a   to pExpr:.**.**
7a90: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20      pExpr->iDb  
7aa0: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65           Set the
7ab0: 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44   index in db->aD
7ac0: 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
7ad0: 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20  ase holding.**  
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65         the table
7b00: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
7b10: 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74  Table        Set
7b20: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e   to the cursor n
7b30: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7b40: 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ble obtained.** 
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72          from pSr
7b70: 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78  cList..**    pEx
7b80: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20  pr->iColumn     
7b90: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c    Set to the col
7ba0: 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
7bb0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
7bc0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
7bd0: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54          Set to T
7be0: 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20  K_COLUMN..**    
7bf0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20  pExpr->pLeft    
7c00: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
7c10: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
7c20: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a  to is deleted.**
7c30: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
7c40: 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70  t        Any exp
7c50: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
7c60: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
7c70: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62  d..**.** The pDb
7c80: 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d  Token is the nam
7c90: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
7ca0: 65 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68  e (the "X").  Th
7cb0: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a  is value may be.
7cc0: 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20  ** NULL meaning 
7cd0: 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20  that name is of 
7ce0: 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20  the form Y.Z or 
7cf0: 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c  Z.  Any availabl
7d00: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61  e database.** ca
7d10: 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20  n be used.  The 
7d20: 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74  pTableToken is t
7d30: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
7d40: 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20  able (the "Y"). 
7d50: 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63   This.** value c
7d60: 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70 44  an be NULL if pD
7d70: 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e  bToken is also N
7d80: 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65 54  ULL.  If pTableT
7d90: 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a  oken is NULL it.
7da0: 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
7db0: 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61  e form of the na
7dc0: 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74  me is Z and that
7dd0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e   columns from an
7de0: 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62  y table.** can b
7df0: 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  e used..**.** If
7e00: 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74   the name cannot
7e10: 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61   be resolved una
7e20: 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76  mbiguously, leav
7e30: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
7e40: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
7e50: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
7e60: 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ero.  Return zer
7e70: 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  o on success..*/
7e80: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b  .static int look
7e90: 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  upName(.  Parse 
7ea0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
7eb0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
7ec0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
7ed0: 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20 20   *pDbToken,     
7ee0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
7ef0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
7f00: 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c  ng table, or NUL
7f10: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  L */.  Token *pT
7f20: 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e  ableToken,  /* N
7f30: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e  ame of table con
7f40: 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20  taining column, 
7f50: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
7f60: 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  en *pColumnToken
7f70: 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  , /* Name of the
7f80: 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61   column. */.  Na
7f90: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
7fa0: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
7fb0: 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72  ontext used to r
7fc0: 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20  esolve the name 
7fd0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
7fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
7ff0: 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65  e this EXPR node
8000: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65   point to the se
8010: 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f  lected column */
8020: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  .){.  char *zDb 
8030: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
8040: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
8050: 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20  se.  The "X" in 
8060: 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  X.Y.Z */.  char 
8070: 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *zTab = 0;      
8080: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
8090: 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69  able.  The "Y" i
80a0: 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a  n X.Y.Z or Y.Z *
80b0: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  /.  char *zCol =
80c0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   0;      /* Name
80d0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
80e0: 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e   The "Z" */.  in
80f0: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
8100: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8110: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ers */.  int cnt
8120: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
8130: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
8140: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
8150: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62   */.  int cntTab
8160: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
8170: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
8180: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a   table names */.
8190: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
81a0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
81b0: 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  The database */.
81c0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
81d0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20  _item *pItem;   
81e0: 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c      /* Use for l
81f0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63  ooping over pSrc
8200: 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20  List items */.  
8210: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
8220: 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b  tem *pMatch = 0;
8230: 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e    /* The matchin
8240: 67 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20  g pSrcList item 
8250: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
8260: 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20   *pTopNC = pNC; 
8270: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8280: 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74  namecontext in t
8290: 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63 68  he list */.  Sch
82a0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 30  ema *pSchema = 0
82b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
82c0: 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65 20  * Schema of the 
82d0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20  expression */.. 
82e0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
82f0: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
8300: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
8310: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
8320: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
8330: 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e    zDb = sqlite3N
8340: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
8350: 20 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54   pDbToken);.  zT
8360: 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ab = sqlite3Name
8370: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
8380: 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43  ableToken);.  zC
8390: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
83a0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43  FromToken(db, pC
83b0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69  olumnToken);.  i
83c0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
83d0: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
83e0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a  lookupname_end;.
83f0: 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54    }..  pExpr->iT
8400: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69  able = -1;.  whi
8410: 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d  le( pNC && cnt==
8420: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
8430: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
8440: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
8450: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
8460: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c  ;..    if( pSrcL
8470: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ist ){.      for
8480: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
8490: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c  List->a; i<pSrcL
84a0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
84b0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
84c0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
84d0: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
84e0: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a          Column *
84f0: 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20  pCol;.  .       
8500: 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
8510: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tab;.        ass
8520: 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
8530: 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
8540: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
8550: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
8560: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 61  hema);.        a
8570: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
8580: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
8590: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
85a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
85b0: 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
85c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
85d0: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
85e0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
85f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8600: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
8610: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
8620: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ue;.          }e
8630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
8640: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
8650: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
8660: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
8670: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  TabName==0 || sq
8680: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
8690: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
86a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
86b0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21          if( zDb!
86c0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
86d0: 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62  ICmp(db->aDb[iDb
86e0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  ].zName, zDb)!=0
86f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8700: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8710: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8720: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8730: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
8740: 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20  cntTab++) ){.   
8750: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
8760: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
8770: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ursor;.         
8780: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
8790: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
87a0: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
87b0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  em;.        }.  
87c0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
87d0: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
87e0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
87f0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
8800: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8810: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
8820: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
8830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
8840: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
8850: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
8860: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  zColl;.         
8870: 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e     IdList *pUsin
8880: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  g;.            c
8890: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
88a0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
88b0: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
88c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
88d0: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
88e0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
88f0: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
8900: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;.            /
8910: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
8920: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
8930: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
8940: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
8950: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
8960: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
8970: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
8980: 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20  -1 : j;.        
8990: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
89a0: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
89b0: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
89c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
89d0: 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
89e0: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20  _ExpCollate)==0 
89f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8a00: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
8a10: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
8a20: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
8a30: 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20  zColl,-1, 0);.  
8a40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8a50: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 70 53          if( i<pS
8a60: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20 29  rcList->nSrc-1 )
8a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8a80: 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69  if( pItem[1].joi
8a90: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
8aa0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
8ab0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
8ac0: 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65 64 20   match occurred 
8ad0: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
8ae0: 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a  e of a natural j
8af0: 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oin,.           
8b00: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b 69       ** then ski
8b10: 70 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  p the right tabl
8b20: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70  e to avoid a dup
8b30: 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a 2f 0a  licate match */.
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
8b60: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
8b80: 65 20 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20  e if( (pUsing = 
8b90: 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e 67 29  pItem[1].pUsing)
8ba0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
8bb0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
8bc0: 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20 6f  s match occurs o
8bd0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  n a column that 
8be0: 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  is in the USING 
8bf0: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 20  clause.         
8c00: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a         ** of a j
8c10: 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65  oin, skip the se
8c20: 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68  arch of the righ
8c30: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
8c40: 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  oin.            
8c50: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
8c60: 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63  a duplicate matc
8c70: 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  h there. */.    
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
8c90: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
8ca0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55     for(k=0; k<pU
8cb0: 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b  sing->nId; k++){
8cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8cd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
8ce0: 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b  rICmp(pUsing->a[
8cf0: 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  k].zName, zCol)=
8d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8d10: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b            pItem+
8d20: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
8d30: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
8d60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8d70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8d80: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8d90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8da0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8db0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8dc0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8dd0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8de0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
8df0: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
8e00: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73   not already res
8e10: 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20  olved the name, 
8e20: 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20  then maybe .    
8e30: 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a  ** it is a new.*
8e40: 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65   or old.* trigge
8e50: 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72  r argument refer
8e60: 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ence.    */.    
8e70: 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54  if( zDb==0 && zT
8e80: 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20  ab!=0 && cnt==0 
8e90: 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  && pParse->trigS
8ea0: 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  tack!=0 ){.     
8eb0: 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70   TriggerStack *p
8ec0: 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70  TriggerStack = p
8ed0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
8ee0: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
8ef0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  Tab = 0;.      u
8f00: 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b 3b 0a 20  32 *piColMask;. 
8f10: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
8f20: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
8f30: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
8f40: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
8f50: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
8f60: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
8f70: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
8f80: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
8f90: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
8fa0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
8fb0: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
8fc0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8fd0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69  pTab;.        pi
8fe0: 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69  ColMask = &(pTri
8ff0: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 43 6f  ggerStack->newCo
9000: 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 65  lMask);.      }e
9010: 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65 72  lse if( pTrigger
9020: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d  Stack->oldIdx !=
9030: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
9040: 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61  rICmp("old", zTa
9050: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
9060: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
9070: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
9080: 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20  oldIdx;.        
9090: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
90a0: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
90b0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
90c0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
90d0: 62 3b 0a 20 20 20 20 20 20 20 20 70 69 43 6f 6c  b;.        piCol
90e0: 4d 61 73 6b 20 3d 20 26 28 70 54 72 69 67 67 65  Mask = &(pTrigge
90f0: 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f 6c 4d 61  rStack->oldColMa
9100: 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  sk);.      }..  
9110: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20      if( pTab ){ 
9120: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
9130: 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  l;.        Colum
9140: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
9150: 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70  aCol;..        p
9160: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
9170: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
9180: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
9190: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
91a0: 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol < pTab->nCol;
91b0: 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29   iCol++, pCol++)
91c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
91d0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
91e0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
91f0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
9200: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9210: 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  *zColl = pTab->a
9220: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b  Col[iCol].zColl;
9230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
9240: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
9250: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
9260: 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
9270: 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f 6c 3b 0a  ey ? -1 : iCol;.
9280: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
9290: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
92a0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
92b0: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
92c0: 20 20 20 20 20 69 66 28 20 28 70 45 78 70 72 2d       if( (pExpr-
92d0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
92e0: 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  ollate)==0 ){.  
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
9300: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
9310: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
9320: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
9330: 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ,-1, 0);.       
9340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9350: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
9360: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
9370: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
9380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9390: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
93a0: 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
93b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
93c0: 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20  ol==32 );.      
93d0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 4d 61          *piColMa
93e0: 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c 3c 69  sk |= ((u32)1<<i
93f0: 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d 33 32  Col) | (iCol>=32
9400: 3f 30 78 66 66 66 66 66 66 66 66 3a 30 29 3b 0a  ?0xffffffff:0);.
9410: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9420: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9430: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9450: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21     }.#endif /* !
9460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9470: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
9480: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
9490: 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20  erhaps the name 
94a0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
94b0: 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20  o the ROWID.    
94c0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
94d0: 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26  0 && cntTab==1 &
94e0: 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
94f0: 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  (zCol) ){.      
9500: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  cnt = 1;.      p
9510: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
9520: 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  -1;.      pExpr-
9530: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
9540: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
9550: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
9560: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75    ** If the inpu
9570: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
9580: 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58   Z (not Y.Z or X
9590: 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e  .Y.Z) then the n
95a0: 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67  ame Z.    ** mig
95b0: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
95c0: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
95d0: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
95e0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
95f0: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20  n.    ** we are 
9600: 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20  resolving names 
9610: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
9620: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  use of the follo
9630: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20  wing command:.  
9640: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
9650: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20  SELECT a+b AS x 
9660: 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45  FROM table WHERE
9670: 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20   x<10;.    **.  
9680: 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69    ** In cases li
9690: 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65  ke this, replace
96a0: 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f   pExpr with a co
96b0: 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
96c0: 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a  sion that.    **
96d0: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c   forms the resul
96e0: 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b  t set entry ("a+
96f0: 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  b" in the exampl
9700: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  e) and return im
9710: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
9720: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
9730: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
9740: 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f  e result set sho
9750: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
9760: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73   been.    ** res
9770: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
9780: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
9790: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
97a0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
97b0: 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74  nt==0 && (pEList
97c0: 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21   = pNC->pEList)!
97d0: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b  =0 && zTab==0 ){
97e0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
97f0: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
9800: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
9810: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
9820: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
9830: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
9840: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
9850: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
9860: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
9870: 78 70 72 20 2a 70 44 75 70 2c 20 2a 70 4f 72 69  xpr *pDup, *pOri
9880: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  g;.          ass
9890: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
98a0: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
98b0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
98c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
98d0: 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
98e0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
98f0: 74 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  t( pExpr->pSelec
9900: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
9910: 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73 74    pOrig = pEList
9920: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[j].pExpr;.  
9930: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4e 43          if( !pNC
9940: 2d 3e 61 6c 6c 6f 77 41 67 67 20 26 26 20 45 78  ->allowAgg && Ex
9950: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f  prHasProperty(pO
9960: 72 69 67 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a  rig, EP_Agg) ){.
9970: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9980: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9990: 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
99a0: 6c 69 61 73 65 64 20 61 67 67 72 65 67 61 74 65  liased aggregate
99b0: 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20   %s", zAs);.    
99c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
99d0: 66 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  free(zCol);.    
99e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32          return 2
99f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9a00: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
9a10: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9a20: 2c 20 70 4f 72 69 67 29 3b 0a 20 20 20 20 20 20  , pOrig);.      
9a30: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
9a40: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
9a50: 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
9a60: 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c 20      pDup->pColl 
9a70: 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75 70              pDup
9a90: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78  ->flags |= EP_Ex
9aa0: 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20  pCollate;.      
9ab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9ac0: 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  if( pExpr->span.
9ad0: 64 79 6e 20 29 20 73 71 6c 69 74 65 33 5f 66 72  dyn ) sqlite3_fr
9ae0: 65 65 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d  ee((char*)pExpr-
9af0: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 20 20 20 20  >span.z);.      
9b00: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
9b10: 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  oken.dyn ) sqlit
9b20: 65 33 5f 66 72 65 65 28 28 63 68 61 72 2a 29 70  e3_free((char*)p
9b30: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  Expr->token.z);.
9b40: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9b50: 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69  (pExpr, pDup, si
9b60: 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20  zeof(*pExpr));. 
9b70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9b80: 5f 66 72 65 65 28 70 44 75 70 29 3b 0a 20 20 20  _free(pDup);.   
9b90: 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a         cnt = 1;.
9ba0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
9bb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9bc0: 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20  assert( zTab==0 
9bd0: 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20  && zDb==0 );.   
9be0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b         goto look
9bf0: 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20  upname_end_2;.  
9c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
9c10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
9c20: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
9c30: 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  xt name context.
9c40: 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20    The loop will 
9c50: 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72  exit when either
9c60: 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20  .    ** we have 
9c70: 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20  a match (cnt>0) 
9c80: 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f  or when we run o
9c90: 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65  ut of name conte
9ca0: 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xts..    */.    
9cb0: 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  if( cnt==0 ){.  
9cc0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
9cd0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
9ce0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20  .  /*.  ** If X 
9cf0: 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28  and Y are NULL (
9d00: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
9d10: 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  f only the colum
9d20: 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a  n name Z is.  **
9d30: 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74   supplied) and t
9d40: 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73  he value of Z is
9d50: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75   enclosed in dou
9d60: 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e  ble-quotes, then
9d70: 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72  .  ** Z is a str
9d80: 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69  ing literal if i
9d90: 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  t doesn't match 
9da0: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  any column names
9db0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
9dc0: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
9dd0: 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
9de0: 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20  ay and not make 
9df0: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20  any changes to. 
9e00: 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a   ** pExpr..  **.
9e10: 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20    ** Because no 
9e20: 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61  reference was ma
9e30: 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74  de to outer cont
9e40: 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e  exts, the pNC->n
9e50: 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20  Ref.  ** fields 
9e60: 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  are not changed 
9e70: 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a  in any context..
9e80: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
9e90: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20  0 && zTab==0 && 
9ea0: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b  pColumnToken->z[
9eb0: 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73  0]=='"' ){.    s
9ec0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
9ed0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
9ee0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
9ef0: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
9f00: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
9f10: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
9f20: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
9f30: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
9f40: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
9f50: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
9f60: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
9f70: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  t!=1 ){.    cons
9f80: 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
9f90: 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20    zErr = cnt==0 
9fa0: 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  ? "no such colum
9fb0: 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20  n" : "ambiguous 
9fc0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20  column name";.  
9fd0: 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20    if( zDb ){.   
9fe0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9ff0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
a000: 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c  %s.%s.%s", zErr,
a010: 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c   zDb, zTab, zCol
a020: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
a030: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73   zTab ){.      s
a040: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a050: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
a060: 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20  s", zErr, zTab, 
a070: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zCol);.    }else
a080: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a090: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a0a0: 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20  "%s: %s", zErr, 
a0b0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
a0c0: 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b   pTopNC->nErr++;
a0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
a0e0: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61  column from a ta
a0f0: 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20  ble in pSrcList 
a100: 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74  is referenced, t
a110: 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  hen record.  ** 
a120: 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65  this fact in the
a130: 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f   pSrcList.a[].co
a140: 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20  lUsed bitmask.  
a150: 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a  Column 0 causes.
a160: 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65    ** bit 0 to be
a170: 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20   set.  Column 1 
a180: 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64  sets bit 1.  And
a190: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
a1a0: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  he.  ** column n
a1b0: 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
a1c0: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
a1d0: 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
a1e0: 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65  bitmask.  ** the
a1f0: 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f  n set the high-o
a200: 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20  rder bit of the 
a210: 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  bitmask..  */.  
a220: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
a230: 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21  mn>=0 && pMatch!
a240: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  =0 ){.    int n 
a250: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
a260: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a270: 6e 3d 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  n==sizeof(Bitmas
a280: 6b 29 2a 38 2d 31 20 29 3b 0a 20 20 20 20 69 66  k)*8-1 );.    if
a290: 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ( n>=sizeof(Bitm
a2a0: 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20  ask)*8 ){.      
a2b0: 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61  n = sizeof(Bitma
a2c0: 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20  sk)*8-1;.    }. 
a2d0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63     assert( pMatc
a2e0: 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70  h->iCursor==pExp
a2f0: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
a300: 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64   pMatch->colUsed
a310: 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29   |= ((Bitmask)1)
a320: 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70  <<n;.  }..lookup
a330: 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43  name_end:.  /* C
a340: 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
a350: 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
a360: 33 5f 66 72 65 65 28 7a 44 62 29 3b 0a 20 20 73  3_free(zDb);.  s
a370: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 62  qlite3_free(zTab
a380: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
a390: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c  Delete(pExpr->pL
a3a0: 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  eft);.  pExpr->p
a3b0: 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Left = 0;.  sqli
a3c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
a3d0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
a3e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
a3f0: 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  0;.  pExpr->op =
a400: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b   TK_COLUMN;.look
a410: 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20  upname_end_2:.  
a420: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
a430: 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31  l);.  if( cnt==1
a440: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a450: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  pNC!=0 );.    sq
a460: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
a470: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63  arse, pExpr, pSc
a480: 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c  hema, pNC->pSrcL
a490: 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ist);.    if( pM
a4a0: 61 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d  atch && !pMatch-
a4b0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a4c0: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
a4d0: 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20  pMatch->pTab;.  
a4e0: 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65    }.    /* Incre
a4f0: 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61  ment the nRef va
a500: 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20  lue on all name 
a510: 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f  contexts from To
a520: 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a  pNC up to.    **
a530: 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65   the point where
a540: 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65   the name matche
a550: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b  d. */.    for(;;
a560: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a570: 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20   pTopNC!=0 );.  
a580: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66      pTopNC->nRef
a590: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ++;.      if( pT
a5a0: 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61  opNC==pNC ) brea
a5b0: 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20  k;.      pTopNC 
a5c0: 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b  = pTopNC->pNext;
a5d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
a5e0: 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n 0;.  } else {.
a5f0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a600: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
a610: 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67  routine is desig
a620: 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20  ned as an xFunc 
a630: 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
a640: 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76  ()..**.** Resolv
a650: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  e symbolic names
a660: 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20   into TK_COLUMN 
a670: 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68  operators for th
a680: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64  e current.** nod
a690: 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
a6a0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
a6b0: 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  n 0 to continue 
a6c0: 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a  the search down.
a6d0: 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32  ** the tree or 2
a6e0: 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72   to abort the tr
a6f0: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ee walk..**.** T
a700: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
a710: 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63   does error chec
a720: 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65  king and name re
a730: 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  solution for.** 
a740: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20  function names. 
a750: 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f   The operator fo
a760: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
a770: 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64  tions is changed
a780: 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55  .** to TK_AGG_FU
a790: 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69  NCTION..*/.stati
a7a0: 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76  c int nameResolv
a7b0: 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72  erStep(void *pAr
a7c0: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
a7d0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
a7e0: 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65  pNC = (NameConte
a7f0: 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73  xt*)pArg;.  Pars
a800: 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66  e *pParse;..  if
a810: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
a820: 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28  urn 1;.  assert(
a830: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61   pNC!=0 );.  pPa
a840: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
a850: 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61  e;..  if( ExprHa
a860: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
a870: 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29  pr, EP_Resolved)
a880: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45   ) return 1;.  E
a890: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
a8a0: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
a8b0: 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  d);.#ifndef NDEB
a8c0: 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53  UG.  if( pNC->pS
a8d0: 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70  rcList && pNC->p
a8e0: 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e  SrcList->nAlloc>
a8f0: 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  0 ){.    SrcList
a900: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
a910: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
a920: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
a930: 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c  =0; i<pNC->pSrcL
a940: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
a950: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a960: 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  SrcList->a[i].iC
a970: 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63  ursor>=0 && pSrc
a980: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
a990: 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29  or<pParse->nTab)
a9a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
a9b0: 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  if.  switch( pEx
a9c0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
a9d0: 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   Double-quoted s
a9e0: 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63  trings (ex: "abc
a9f0: 22 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69  ") are used as i
aa00: 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20  dentifiers if.  
aa10: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20    ** possible.  
aa20: 4f 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72  Otherwise they r
aa30: 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73  emain as strings
aa40: 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64  .  Single-quoted
aa50: 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  .    ** strings 
aa60: 28 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20  (ex: 'abc') are 
aa70: 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69  always string li
aa80: 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20  terals..    */. 
aa90: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
aaa0: 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  G: {.      if( p
aab0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  Expr->token.z[0]
aac0: 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a  =='\'' ) break;.
aad0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
aae0: 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49  ru into the TK_I
aaf0: 44 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69  D case if this i
ab00: 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  s a double-quote
ab10: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  d string */.    
ab20: 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20  }.    /* A lone 
ab30: 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68  identifier is th
ab40: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
ab50: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  mn..    */.    c
ab60: 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20  ase TK_ID: {.   
ab70: 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50     lookupName(pP
ab80: 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78  arse, 0, 0, &pEx
ab90: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20  pr->token, pNC, 
aba0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65  pExpr);.      re
abb0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
abc0: 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  .    /* A table 
abd0: 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  name and column 
abe0: 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a  name:     ID.ID.
abf0: 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61      ** Or a data
ac00: 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20  base, table and 
ac10: 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49  column:  ID.ID.I
ac20: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  D.    */.    cas
ac30: 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20  e TK_DOT: {.    
ac40: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e    Token *pColumn
ac50: 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  ;.      Token *p
ac60: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b  Table;.      Tok
ac70: 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45  en *pDb;.      E
ac80: 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20  xpr *pRight;..  
ac90: 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c      /* if( pSrcL
aca0: 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20  ist==0 ) break; 
acb0: 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  */.      pRight 
acc0: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
acd0: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
ace0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  t->op==TK_ID ){.
acf0: 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b          pDb = 0;
ad00: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20  .        pTable 
ad10: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
ad20: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
ad30: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
ad40: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
ad50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
ad60: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
ad70: 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20  p==TK_DOT );.   
ad80: 20 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70       pDb = &pExp
ad90: 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  r->pLeft->token;
ada0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20  .        pTable 
adb0: 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74  = &pRight->pLeft
adc0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
add0: 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67   pColumn = &pRig
ade0: 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65  ht->pRight->toke
adf0: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
ae00: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
ae10: 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c  se, pDb, pTable,
ae20: 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70   pColumn, pNC, p
ae30: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
ae40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
ae50: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e    /* Resolve fun
ae60: 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20  ction names.    
ae70: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
ae80: 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
ae90: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
aea0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
aeb0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
aec0: 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54  ->pList;    /* T
aed0: 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  he argument list
aee0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
aef0: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
af00: 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20  >nExpr : 0;  /* 
af10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
af20: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
af30: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
af40: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
af50: 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63   if no such func
af60: 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20  tion exists */. 
af70: 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e       int wrong_n
af80: 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20  um_args = 0;    
af90: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e   /* True if wron
afa0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
afb0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
afc0: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20  nt is_agg = 0;  
afd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
afe0: 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72  ue if is an aggr
aff0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
b000: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  /.      int i;. 
b010: 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20       int auth;  
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f   /* Authorizatio
b040: 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e  n to use the fun
b050: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
b060: 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20  nt nId;         
b070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b080: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
b090: 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e  rs in function n
b0a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ame */.      con
b0b0: 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
b0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b0d0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a  function name. *
b0e0: 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
b0f0: 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pDef;          
b100: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
b110: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e  on about the fun
b120: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
b130: 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  nt enc = ENC(pPa
b140: 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68  rse->db);  /* Th
b150: 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64  e database encod
b160: 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49  ing */..      zI
b170: 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72  d = (char*)pExpr
b180: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
b190: 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   nId = pExpr->to
b1a0: 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65  ken.n;.      pDe
b1b0: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
b1c0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
b1d0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c  db, zId, nId, n,
b1e0: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
b1f0: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
b200: 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
b210: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
b220: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
b230: 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c  d, nId, -1, enc,
b240: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
b250: 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
b260: 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75        no_such_fu
b270: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
b280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b290: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
b2a0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
b2b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b2c0: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65      is_agg = pDe
b2d0: 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20  f->xFunc==0;.   
b2e0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
b2f0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
b300: 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28  ZATION.      if(
b310: 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20   pDef ){.       
b320: 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41   auth = sqlite3A
b330: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
b340: 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e   SQLITE_FUNCTION
b350: 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  , 0, pDef->zName
b360: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b370: 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f  ( auth!=SQLITE_O
b380: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
b390: 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f  f( auth==SQLITE_
b3a0: 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20  DENY ){.        
b3b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b3c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74  Msg(pParse, "not
b3d0: 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75   authorized to u
b3e0: 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22  se function: %s"
b3f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d        pDef->zNam
b420: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
b430: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
b440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b450: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
b460: 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  K_NULL;.        
b470: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b480: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
b490: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 69  ndif.      if( i
b4a0: 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61  s_agg && !pNC->a
b4b0: 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20  llowAgg ){.     
b4c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b4d0: 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
b4e0: 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  se of aggregate 
b4f0: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
b500: 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20  , nId,zId);.    
b510: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
b520: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
b530: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
b540: 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   if( no_such_fun
b550: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
b560: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b570: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75  rse, "no such fu
b580: 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e  nction: %.*s", n
b590: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
b5a0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
b5b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77       }else if( w
b5c0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b  rong_num_args ){
b5d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b5e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b5f0: 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
b600: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
b610: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a  nction %.*s()",.
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64               nId
b630: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
b640: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
b650: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
b660: 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20  s_agg ){.       
b670: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
b680: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20  AGG_FUNCTION;.  
b690: 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67        pNC->hasAg
b6a0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 1;.      }. 
b6b0: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
b6c0: 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20  ) pNC->allowAgg 
b6d0: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 0;.      for(i
b6e0: 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30  =0; pNC->nErr==0
b6f0: 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20   && i<n; i++){. 
b700: 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54         walkExprT
b710: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
b720: 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c  pExpr, nameResol
b730: 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20  verStep, pNC);. 
b740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b750: 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61   is_agg ) pNC->a
b760: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20  llowAgg = 1;.   
b770: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43     /* FIX ME:  C
b780: 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66  ompute pExpr->af
b790: 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20  finity based on 
b7a0: 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74  the expected ret
b7b0: 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70  urn.      ** typ
b7c0: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
b7d0: 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n .      */.    
b7e0: 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b    return is_agg;
b7f0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b800: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b810: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
b820: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
b830: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64   TK_EXISTS:.#end
b840: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  if.    case TK_I
b850: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
b860: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
b870: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65  .        int nRe
b880: 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23  f = pNC->nRef;.#
b890: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b8a0: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20  IT_CHECK.       
b8b0: 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63   if( pNC->isChec
b8c0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  k ){.          s
b8d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b8e0: 50 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65  Parse,"subquerie
b8f0: 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
b900: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b910: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  s");.        }.#
b920: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71  endif.        sq
b930: 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
b940: 76 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ve(pParse, pExpr
b950: 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b  ->pSelect, pNC);
b960: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b970: 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66   pNC->nRef>=nRef
b980: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b990: 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20  nRef!=pNC->nRef 
b9a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
b9b0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
b9c0: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
b9d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b9e0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
b9f0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
ba00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
ba10: 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  K.    case TK_VA
ba20: 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
ba30: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
ba40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ba50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ba60: 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70  se,"parameters p
ba70: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45  rohibited in CHE
ba80: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  CK constraints")
ba90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
baa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
bab0: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
bac0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
bad0: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
bae0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
baf0: 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20  ee and resolves 
bb00: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a  references to.**
bb10: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20   table columns. 
bb20: 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f   Nodes of the fo
bb30: 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72  rm ID.ID or ID r
bb40: 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a  esolve into an.*
bb50: 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74  * index to the t
bb60: 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c  able in the tabl
bb70: 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c  e list and a col
bb80: 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65  umn offset.  The
bb90: 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65   .** Expr.opcode
bba0: 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20   for such nodes 
bbb0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
bbc0: 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78  _COLUMN.  The Ex
bbd0: 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c  pr.iTable.** val
bbe0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
bbf0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
bc00: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
bc10: 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a  le in pTabList.*
bc20: 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65  * plus the "base
bc30: 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61  " value.  The ba
bc40: 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c  se value will ul
bc50: 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20  timately become 
bc60: 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73  the.** VDBE curs
bc70: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20  or number for a 
bc80: 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
bc90: 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65  ointing into the
bca0: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74   referenced.** t
bcb0: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
bcc0: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73  iColumn value is
bcd0: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20   changed to the 
bce0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
bcf0: 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72  umn .** of the r
bd00: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e  eferenced table.
bd10: 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75    The Expr.iColu
bd20: 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  mn value for the
bd30: 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49   special.** ROWI
bd40: 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20  D column is -1. 
bd50: 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49   Any INTEGER PRI
bd60: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
bd70: 69 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a  is tried as an.*
bd80: 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49  * alias for ROWI
bd90: 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  D..**.** Also re
bda0: 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e  solve function n
bdb0: 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74  ames and check t
bdc0: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72  he functions for
bdd0: 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65   proper.** usage
bde0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  .  Make sure all
bdf0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20   function names 
be00: 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61  are recognized a
be10: 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73  nd all functions
be20: 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72  .** have the cor
be30: 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61  rect number of a
be40: 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65  rguments.  Leave
be50: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
be60: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e  e.** in pParse->
be70: 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68  zErrMsg if anyth
be80: 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52  ing is amiss.  R
be90: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
bea0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
beb0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
bec0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67  ion contains agg
bed0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
bee0: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50   then set the EP
bef0: 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79  _Agg.** property
bf00: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
bf10: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
bf20: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
bf30: 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  es( .  NameConte
bf40: 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f  xt *pNC,       /
bf50: 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72  * Namespace to r
bf60: 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f  esolve expressio
bf70: 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72  ns in. */.  Expr
bf80: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
bf90: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
bfa0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
bfb0: 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  yzed. */.){.  in
bfc0: 74 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 0a  t savedHasAgg;..
bfd0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
bfe0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53   return 0;.#if S
bff0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
c000: 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20 69  EPTH>0.  {.    i
c010: 6e 74 20 6d 78 44 65 70 74 68 20 3d 20 70 4e 43  nt mxDepth = pNC
c020: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  ->pParse->db->aL
c030: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
c040: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a 20  T_EXPR_DEPTH];. 
c050: 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 6e     if( (pExpr->n
c060: 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61 72  Height+pNC->pPar
c070: 73 65 2d 3e 6e 48 65 69 67 68 74 29 3e 6d 78 44  se->nHeight)>mxD
c080: 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71  epth ){.      sq
c090: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e  lite3ErrorMsg(pN
c0a0: 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20  C->pParse, .    
c0b0: 20 20 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e       "Expression
c0c0: 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72   tree is too lar
c0d0: 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74  ge (maximum dept
c0e0: 68 20 25 64 29 22 2c 20 6d 78 44 65 70 74 68 0a  h %d)", mxDepth.
c0f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
c100: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
c110: 20 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e     pNC->pParse->
c120: 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78 70 72  nHeight += pExpr
c130: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 7d 0a 23  ->nHeight;.  }.#
c140: 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61 73  endif.  savedHas
c150: 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67  Agg = pNC->hasAg
c160: 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67  g;.  pNC->hasAgg
c170: 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 0;.  walkExpr
c180: 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65  Tree(pExpr, name
c190: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
c1a0: 43 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  C);.#if SQLITE_M
c1b0: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
c1c0: 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e    pNC->pParse->n
c1d0: 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d  Height -= pExpr-
c1e0: 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66  >nHeight;.#endif
c1f0: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72  .  if( pNC->nErr
c200: 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  >0 ){.    ExprSe
c210: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
c220: 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a   EP_Error);.  }.
c230: 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41 67    if( pNC->hasAg
c240: 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  g ){.    ExprSet
c250: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
c260: 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65  EP_Agg);.  }else
c270: 20 69 66 28 20 73 61 76 65 64 48 61 73 41 67 67   if( savedHasAgg
c280: 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73   ){.    pNC->has
c290: 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  Agg = 1;.  }.  r
c2a0: 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f  eturn ExprHasPro
c2b0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
c2c0: 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Error);.}../*.**
c2d0: 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61   A pointer insta
c2e0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
c2f0: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  cture is used to
c300: 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f   pass informatio
c310: 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c  n.** through wal
c320: 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63  kExprTree into c
c330: 6f 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28  odeSubqueryStep(
c340: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
c350: 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20  ruct QueryCoder 
c360: 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75  QueryCoder;.stru
c370: 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a  ct QueryCoder {.
c380: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
c390: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
c3a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c3b0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
c3c0: 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73  pNC;    /* Names
c3d0: 70 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e  pace of first en
c3e0: 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f  closing query */
c3f0: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
c400: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
c410: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 69 6e 5f  lite3_enable_in_
c420: 6f 70 74 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  opt = 1;.#else. 
c430: 20 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33   #define sqlite3
c440: 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 20 31  _enable_in_opt 1
c450: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
c460: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c470: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
c480: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
c490: 65 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61  e IN (...) opera
c4a0: 74 6f 72 2e 0a 2a 2a 20 49 74 27 73 20 6a 6f 62  tor..** It's job
c4b0: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
c4c0: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 73  reate a b-tree s
c4d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6d 61  tructure that ma
c4e0: 79 20 62 65 20 75 73 65 64 0a 2a 2a 20 65 69 74  y be used.** eit
c4f0: 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20  her to test for 
c500: 6d 65 6d 62 65 72 73 68 69 70 20 6f 66 20 74 68  membership of th
c510: 65 20 28 2e 2e 2e 29 20 73 65 74 20 6f 72 20 74  e (...) set or t
c520: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
c530: 68 0a 2a 2a 20 69 74 73 20 6d 65 6d 62 65 72 73  h.** its members
c540: 2c 20 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69  , skipping dupli
c550: 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cates..**.** The
c560: 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 6f   cursor opened o
c570: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
c580: 28 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c  (database table,
c590: 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
c5a0: 0a 2a 2a 20 6f 72 20 65 70 68 65 72 6d 61 6c 20  .** or ephermal 
c5b0: 74 61 62 6c 65 29 20 69 73 20 73 74 6f 72 65 64  table) is stored
c5c0: 20 69 6e 20 70 58 2d 3e 69 54 61 62 6c 65 20 62   in pX->iTable b
c5d0: 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
c5e0: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 20  ion returns..** 
c5f0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
c600: 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  ue indicates the
c610: 20 73 74 72 75 63 74 75 72 65 20 74 79 70 65 2c   structure type,
c620: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
c630: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
c640: 57 49 44 20 2d 20 54 68 65 20 63 75 72 73 6f 72  WID - The cursor
c650: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
c660: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
c670: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
c680: 4e 44 45 58 20 2d 20 54 68 65 20 63 75 72 73 6f  NDEX - The curso
c690: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c6a0: 61 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  a database index
c6b0: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
c6c0: 45 50 48 20 2d 20 20 20 54 68 65 20 63 75 72 73  EPH -   The curs
c6d0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
c6e0: 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65   a specially cre
c6f0: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ated and.**     
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c710: 6f 70 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d  opulated epherem
c720: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
c730: 41 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72 75  An existing stru
c740: 63 74 75 72 65 20 6d 61 79 20 6f 6e 6c 79 20 62  cture may only b
c750: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 53 45  e used if the SE
c760: 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 73  LECT is of the s
c770: 69 6d 70 6c 65 0a 2a 2a 20 66 6f 72 6d 3a 0a 2a  imple.** form:.*
c780: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
c790: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
c7a0: 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able>.**.** If t
c7b0: 68 65 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20  he mustBeUnique 
c7c0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
c7d0: 73 65 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  se, the structur
c7e0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
c7f0: 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74 20  ** for fast set 
c800: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
c810: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
c820: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
c830: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
c840: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
c850: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
c860: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
c870: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
c880: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
c890: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
c8a0: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
c8b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6d 75 73 74 42 65  .**.** If mustBe
c8c0: 55 6e 69 71 75 65 20 69 73 20 74 72 75 65 2c 20  Unique is true, 
c8d0: 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74 75  then the structu
c8e0: 72 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  re will be used 
c8f0: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
c900: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
c910: 6d 62 65 72 73 2c 20 73 6b 69 70 70 69 6e 67 20  mbers, skipping 
c920: 61 6e 79 20 64 75 70 6c 69 63 61 74 65 73 2e 20  any duplicates. 
c930: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 0a  In this case an.
c940: 2a 2a 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ** epheremal tab
c950: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
c960: 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63  unless the selec
c970: 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20  ted <column> is 
c980: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
c990: 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74   be unique - eit
c9a0: 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20 69  her because it i
c9b0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
c9c0: 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a  MARY KEY or it.*
c9d0: 2a 20 69 73 20 75 6e 69 71 75 65 20 62 79 20 76  * is unique by v
c9e0: 69 72 74 75 65 20 6f 66 20 61 20 63 6f 6e 73 74  irtue of a const
c9f0: 72 61 69 6e 74 20 6f 72 20 69 6d 70 6c 69 63 69  raint or implici
ca00: 74 20 69 6e 64 65 78 2e 0a 2a 2f 0a 23 69 66 6e  t index..*/.#ifn
ca10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ca20: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
ca30: 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
ca40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
ca50: 78 70 72 20 2a 70 58 2c 20 69 6e 74 20 6d 75 73  xpr *pX, int mus
ca60: 74 42 65 55 6e 69 71 75 65 29 7b 0a 20 20 53 65  tBeUnique){.  Se
ca70: 6c 65 63 74 20 2a 70 3b 0a 20 20 69 6e 74 20 65  lect *p;.  int e
ca80: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
ca90: 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
caa0: 54 61 62 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  Tab++;..  /* The
cab0: 20 66 6f 6c 6c 77 69 6e 67 20 69 66 28 2e 2e 2e   follwing if(...
cac0: 29 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ) expression is 
cad0: 74 72 75 65 20 69 66 20 74 68 65 20 53 45 4c 45  true if the SELE
cae0: 43 54 20 69 73 20 6f 66 20 74 68 65 20 0a 20 20  CT is of the .  
caf0: 2a 2a 20 73 69 6d 70 6c 65 20 66 6f 72 6d 3a 0a  ** simple form:.
cb00: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
cb10: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
cb20: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 20 20 2a 2a 0a  OM <table>.  **.
cb30: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
cb40: 74 68 65 20 63 61 73 65 2c 20 69 74 20 6d 61 79  the case, it may
cb50: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
cb60: 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  use an existing 
cb70: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 69 6e  table.  ** or in
cb80: 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 67  dex instead of g
cb90: 65 6e 65 72 61 74 69 6e 67 20 61 6e 20 65 70 68  enerating an eph
cba0: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 20 20  eremal table..  
cbb0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
cbc0: 5f 65 6e 61 62 6c 65 5f 69 6e 5f 6f 70 74 0a 20  _enable_in_opt. 
cbd0: 20 20 26 26 20 28 70 3d 70 58 2d 3e 70 53 65 6c    && (p=pX->pSel
cbe0: 65 63 74 29 21 3d 30 20 26 26 20 21 70 2d 3e 70  ect)!=0 && !p->p
cbf0: 50 72 69 6f 72 0a 20 20 20 26 26 20 21 70 2d 3e  Prior.   && !p->
cc00: 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 21 70  isDistinct && !p
cc10: 2d 3e 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70  ->isAgg && !p->p
cc20: 47 72 6f 75 70 42 79 0a 20 20 20 26 26 20 70 2d  GroupBy.   && p-
cc30: 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63  >pSrc && p->pSrc
cc40: 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 21 70 2d  ->nSrc==1 && !p-
cc50: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
cc60: 65 63 74 0a 20 20 20 26 26 20 70 2d 3e 70 53 72  ect.   && p->pSr
cc70: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 26 26 20  c->a[0].pTab && 
cc80: 21 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  !p->pSrc->a[0].p
cc90: 54 61 62 2d 3e 70 53 65 6c 65 63 74 0a 20 20 20  Tab->pSelect.   
cca0: 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
ccb0: 78 70 72 3d 3d 31 20 26 26 20 70 2d 3e 70 45 4c  xpr==1 && p->pEL
ccc0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
ccd0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
cce0: 20 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20    && !p->pLimit 
ccf0: 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 26  && !p->pOffset &
cd00: 26 20 21 70 2d 3e 70 57 68 65 72 65 0a 20 20 29  & !p->pWhere.  )
cd10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
cd20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cd30: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
cd40: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
cd50: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
cd60: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e  0].pExpr;.    in
cd70: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
cd80: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 56 64 62  iColumn;.    Vdb
cd90: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
cda0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 0a  tVdbe(pParse);..
cdb0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
cdc0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
cdd0: 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61  led from two pla
cde0: 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73  ces. In both cas
cdf0: 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20  es the vdbe.    
ce00: 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
ce10: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53  een allocated. S
ce20: 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33  o assume sqlite3
ce30: 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77  GetVdbe() is alw
ce40: 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  ays.    ** succe
ce50: 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20  ssful here..    
ce60: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29  */.    assert(v)
ce70: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
ce80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   ){.      int iM
ce90: 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
cea0: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Mem;.      int i
ceb0: 41 64 64 72 3b 0a 20 20 20 20 20 20 54 61 62 6c  Addr;.      Tabl
cec0: 65 20 2a 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  e *pTab = p->pSr
ced0: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
cee0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
cef0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
cf00: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
cf10: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
cf20: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
cf30: 65 28 76 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20  e(v, iDb);..    
cf40: 20 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65    iAddr = sqlite
cf50: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
cf60: 50 5f 49 66 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  P_If, iMem);.   
cf70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
cf90: 65 72 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 0a 20  er, 1, iMem);.. 
cfa0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
cfb0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
cfc0: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
cfd0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
cfe0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
cff0: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
d000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d010: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
d020: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d030: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
d040: 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  on sequence used
d050: 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73   by the comparis
d060: 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20  on. If an index 
d070: 69 73 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  is to .      ** 
d080: 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  be used in place
d090: 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65   of a temp-table
d0a0: 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64  , it must be ord
d0b0: 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20  ered according. 
d0c0: 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20       ** to this 
d0d0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
d0e0: 63 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ce..      */.   
d0f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
d100: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
d110: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
d120: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
d130: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
d140: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
d150: 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
d160: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
d170: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20   perform the .  
d180: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
d190: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
d1a0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
d1b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a   the column. If.
d1c0: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
d1d0: 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
d1e0: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
d1f0: 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  y index..      *
d200: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
d210: 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
d220: 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [0].pTab;.      
d230: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
d240: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 58  risonAffinity(pX
d250: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  );.      int aff
d260: 69 6e 69 74 79 5f 6f 6b 20 3d 20 28 70 54 61 62  inity_ok = (pTab
d270: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66  ->aCol[iCol].aff
d280: 69 6e 69 74 79 3d 3d 61 66 66 7c 7c 61 66 66 3d  inity==aff||aff=
d290: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
d2a0: 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49  );..      for(pI
d2b0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d2c0: 20 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d   pIdx && eType==
d2d0: 30 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b  0 && affinity_ok
d2e0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
d2f0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
d300: 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e   (pIdx->aiColumn
d310: 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20  [0]==iCol).     
d320: 20 20 20 20 26 26 20 28 70 52 65 71 3d 3d 73 71      && (pReq==sq
d330: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
d340: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49  (db, ENC(db), pI
d350: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 2d  dx->azColl[0], -
d360: 31 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  1, 0)).         
d370: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
d380: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  e || (pIdx->nCol
d390: 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e  umn==1 && pIdx->
d3a0: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
d3b0: 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
d3c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
d3d0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
d3e0: 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
d3f0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
d400: 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 20 20 20  int iAddr;.     
d410: 20 20 20 20 20 63 68 61 72 20 2a 70 4b 65 79 3b       char *pKey;
d420: 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 70 4b  .  .          pK
d430: 65 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ey = (char *)sql
d440: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
d450: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
d460: 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
d470: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
d480: 6e 64 65 78 28 64 62 2c 20 70 49 64 78 2d 3e 70  ndex(db, pIdx->p
d490: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
d4a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
d4b0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
d4c0: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 41 64 64  ..          iAdd
d4d0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d4e0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
d4f0: 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  iMem);.         
d500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d510: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
d520: 2c 20 31 2c 20 69 4d 65 6d 29 3b 0a 20 20 0a 20  , 1, iMem);.  . 
d530: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d540: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d550: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
d560: 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  0, pIdx->nColumn
d570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
d590: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
d5a0: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
d5b0: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 20 20 20 20 20 70 4b 65 79 2c 50 34 5f 4b 45 59       pKey,P4_KEY
d5e0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
d5f0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
d600: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
d610: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
d620: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
d630: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 3b 0a  IN_INDEX_INDEX;.
d640: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d650: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d660: 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20  , iAddr);.      
d670: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d680: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54 79  }.  }..  if( eTy
d690: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  pe==0 ){.    sql
d6a0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
d6b0: 74 28 70 50 61 72 73 65 2c 20 70 58 29 3b 0a 20  t(pParse, pX);. 
d6c0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
d6d0: 44 45 58 5f 45 50 48 3b 0a 20 20 7d 65 6c 73 65  DEX_EPH;.  }else
d6e0: 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
d6f0: 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72   = iTab;.  }.  r
d700: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
d710: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
d720: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
d730: 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
d740: 20 75 73 65 64 20 61 73 20 61 6e 20 65 78 70 72   used as an expr
d750: 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e  ession.** and IN
d760: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
d770: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
d780: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
d790: 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
d7a0: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
d7b0: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
d7c0: 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
d7d0: 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
d7e0: 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
d7f0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
d800: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
d810: 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
d820: 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
d830: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
d840: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
d850: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
d860: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
d870: 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
d880: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
d890: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
d8a0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
d8b0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
d8c0: 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
d8d0: 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  bquery..*/.#ifnd
d8e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
d8f0: 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c  UBQUERY.void sql
d900: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
d910: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
d920: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
d930: 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20   int testAddr = 
d940: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
d960: 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
d970: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
d980: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d990: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
d9a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 0a  ==0 ) return;...
d9b0: 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
d9c0: 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
d9d0: 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
d9e0: 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
d9f0: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
da00: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
da10: 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
da20: 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
da30: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
da40: 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
da50: 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
da60: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
da70: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
da80: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
da90: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
daa0: 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
dab0: 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
dac0: 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
dad0: 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
dae0: 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
daf0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
db00: 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
db10: 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
db20: 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
db30: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
db40: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
db50: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
db60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
db70: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
db80: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
db90: 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d  ect) && !pParse-
dba0: 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
dbb0: 20 20 69 6e 74 20 6d 65 6d 20 3d 20 2b 2b 70 50    int mem = ++pP
dbc0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
dbd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbe0: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 6d 65 6d 29  1(v, OP_If, mem)
dbf0: 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d  ;.    testAddr =
dc00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc10: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
dc20: 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 20 20 61  , 1, mem);.    a
dc30: 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e  ssert( testAddr>
dc40: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
dc50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
dc60: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
dc70: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
dc80: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
dc90: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
dca0: 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ty;.      KeyInf
dcb0: 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  o keyInfo;.     
dcc0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
dcd0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
dce0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
dcf0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
dd00: 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20  .      affinity 
dd10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
dd20: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
dd30: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
dd40: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
dd50: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
dd60: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
dd70: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
dd80: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
dd90: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
dda0: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76  he same way. A v
ddb0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20  irtual table is 
ddc0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
ddd0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
dde0: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
ddf0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
de00: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
de10: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
de20: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
de30: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
de40: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
de50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
de60: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
de70: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
de80: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
de90: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
dea0: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
deb0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
dec0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
ded0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
dee0: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
def0: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
df00: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
df10: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
df20: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
df30: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
df40: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
df50: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
df60: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
df70: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
df80: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
df90: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
dfa0: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
dfb0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
dfc0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
dfd0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
dfe0: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
dff0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
e000: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
e010: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
e020: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
e030: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e040: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
e050: 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
e060: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20  Table, 1);.     
e070: 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f   memset(&keyInfo
e080: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49  , 0, sizeof(keyI
e090: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79  nfo));.      key
e0a0: 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b  Info.nField = 1;
e0b0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ..      if( pExp
e0c0: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
e0d0: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
e0e0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
e0f0: 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
e100: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
e110: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e120: 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
e130: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
e140: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
e150: 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
e160: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
e170: 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
e180: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e190: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
e1a0: 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70  est;.        Exp
e1b0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
e1c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
e1d0: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
e1e0: 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
e1f0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
e200: 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 69 6e        dest.affin
e210: 69 74 79 20 3d 20 28 69 6e 74 29 61 66 66 69 6e  ity = (int)affin
e220: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ity;.        ass
e230: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
e240: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
e250: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
e260: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
e270: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e280: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
e290: 63 74 2c 20 26 64 65 73 74 2c 20 30 2c 20 30 2c  ct, &dest, 0, 0,
e2a0: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
e2b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
e2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45      }.        pE
e2d0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53  List = pExpr->pS
e2e0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
e2f0: 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73         if( pELis
e300: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
e310: 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20  pr>0 ){ .       
e320: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
e330: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
e340: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
e350: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
e360: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
e370: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
e380: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
e390: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e3a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
e3b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
e3c0: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
e3d0: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
e3e0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
e3f0: 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78    ** For each ex
e400: 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20  pression, build 
e410: 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f  an index key fro
e420: 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  m the evaluation
e430: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
e440: 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
e450: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
e460: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20   If <expr> is a 
e470: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65  column, then use
e480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
e490: 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
e4a0: 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  y when building 
e4b0: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c  index keys. If <
e4c0: 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20  expr> is not.   
e4d0: 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e       ** a column
e4e0: 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66  , use numeric af
e4f0: 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20  finity..        
e500: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
e510: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
e520: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
e530: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
e540: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
e550: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
e560: 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
e570: 32 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  2;..        if( 
e580: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
e590: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
e5a0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
e5b0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
e5c0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
e5d0: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
e5e0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
e5f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
e600: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
e610: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
e620: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
e630: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
e640: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
e650: 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
e660: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
e670: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
e680: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
e690: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
e6a0: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
e6b0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
e6c0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
e6d0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
e6e0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
e6f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
e700: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
e710: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
e720: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
e730: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
e740: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
e750: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
e760: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
e770: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
e780: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
e790: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
e7a0: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
e7b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
e7c0: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
e7d0: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
e7e0: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
e7f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e800: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
e810: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
e820: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
e830: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
e840: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e850: 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41 64  ToNoop(v, testAd
e860: 64 72 2d 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  dr-1, 2);.      
e870: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
e880: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
e890: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
e8a0: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
e8b0: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
e8c0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
e8d0: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
e8e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
e8f0: 61 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  ableColCache++;.
e900: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e910: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e920: 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20  , pE2, r1);.    
e930: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
e940: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
e950: 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20 20  Cache>0 );.     
e960: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73       pParse->dis
e970: 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a  ableColCache--;.
e980: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e990: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
e9a0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 31  P_MakeRecord, r1
e9b0: 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69  , 1, r2, &affini
e9c0: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
e9d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
e9e0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
e9f0: 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
ea00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ea10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ea20: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45  OP_IdxInsert, pE
ea30: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29  xpr->iTable, r2)
ea40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ea50: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ea60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ea70: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
ea80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ea90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
eaa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
eab0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
eac0: 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
ead0: 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50  id *)&keyInfo, P
eae0: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
eaf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
eb00: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
eb10: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
eb20: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
eb30: 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62  /* This has to b
eb40: 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
eb50: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
eb60: 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
eb70: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
eb80: 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
eb90: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
eba0: 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
ebb0: 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
ebc0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
ebd0: 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20   iColumn..      
ebe0: 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
ebf0: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20  const Token one 
ec00: 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c  = { (u8*)"1", 0,
ec10: 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65   1 };.      Sele
ec20: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20  ct *pSel;.      
ec30: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
ec40: 0a 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ..      pSel = p
ec50: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
ec60: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
ec70: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
ec80: 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  , 0, ++pParse->n
ec90: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
eca0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
ecb0: 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
ecc0: 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
ecd0: 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  _Mem;.        sq
ece0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ecf0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
ed00: 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20  est.iParm);.    
ed10: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ed20: 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65  (v, "Init subque
ed30: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
ed40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ed50: 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
ed60: 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
ed70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ed80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
ed90: 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 50 61  ger, 0, dest.iPa
eda0: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
edb0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
edc0: 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
edd0: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
ede0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
edf0: 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d 69  lete(pSel->pLimi
ee00: 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  t);.      pSel->
ee10: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
ee20: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
ee30: 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20  _INTEGER, 0, 0, 
ee40: 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28  &one);.      if(
ee50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
ee60: 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65  Parse, pSel, &de
ee70: 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20  st, 0, 0, 0, 0) 
ee80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
ee90: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
eea0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
eeb0: 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20  = dest.iParm;.  
eec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
eed0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74  .  }..  if( test
eee0: 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Addr ){.    sqli
eef0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ef00: 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a  v, testAddr-1);.
ef10: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 7d    }..  return;.}
ef20: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ef30: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
ef40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63  */../*.** Duplic
ef50: 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61  ate an 8-byte va
ef60: 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  lue.*/.static ch
ef70: 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56 64  ar *dup8bytes(Vd
ef80: 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
ef90: 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a  r *in){.  char *
efa0: 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  out = sqlite3DbM
efb0: 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33  allocRaw(sqlite3
efc0: 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20  VdbeDb(v), 8);. 
efd0: 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
efe0: 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20  memcpy(out, in, 
eff0: 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  8);.  }.  return
f000: 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   out;.}../*.** G
f010: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
f020: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
f030: 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e   put the floatin
f040: 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
f050: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b   described by z[
f060: 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67  0..n-1] into reg
f070: 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a  ister iMem..**.*
f080: 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67  * The z[] string
f090: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e   will probably n
f0a0: 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69  ot be zero-termi
f0b0: 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20  nated.  But the 
f0c0: 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74  .** z[n] charact
f0d0: 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
f0e0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
f0f0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c   that does not l
f100: 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20  ook.** like the 
f110: 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20  continuation of 
f120: 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  the number..*/.s
f130: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52  tatic void codeR
f140: 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  eal(Vdbe *v, con
f150: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
f160: 6e 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61  n, int negateFla
f170: 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
f180: 61 73 73 65 72 74 28 20 7a 20 7c 7c 20 76 3d 3d  assert( z || v==
f190: 30 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65  0 || sqlite3Vdbe
f1a0: 44 62 28 76 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Db(v)->mallocFai
f1b0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 20 29  led );.  if( z )
f1c0: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c  {.    double val
f1d0: 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56  ue;.    char *zV
f1e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
f1f0: 73 64 69 67 69 74 28 7a 5b 6e 5d 29 20 29 3b 0a  sdigit(z[n]) );.
f200: 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
f210: 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
f220: 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20 29  if( negateFlag )
f230: 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b   value = -value;
f240: 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79  .    zV = dup8by
f250: 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
f260: 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  alue);.    sqlit
f270: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
f280: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d  OP_Real, 0, iMem
f290: 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c  , 0, zV, P4_REAL
f2a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
f2b0: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
f2c0: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
f2d0: 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
f2e0: 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
f2f0: 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
f300: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
f310: 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  Mem..**.** The z
f320: 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70  [] string will p
f330: 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a  robably not be z
f340: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20  ero-terminated. 
f350: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e   But the .** z[n
f360: 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67  ] character is g
f370: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
f380: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64  something that d
f390: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20  oes not look.** 
f3a0: 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75  like the continu
f3b0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d  ation of the num
f3c0: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
f3d0: 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
f3e0: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
f3f0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69  har *z, int n, i
f400: 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
f410: 69 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28  iMem){.  assert(
f420: 20 7a 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71   z || v==0 || sq
f430: 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2d 3e  lite3VdbeDb(v)->
f440: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
f450: 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 69    if( z ){.    i
f460: 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
f470: 28 20 21 69 73 64 69 67 69 74 28 7a 5b 6e 5d 29  ( !isdigit(z[n])
f480: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
f490: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26  te3GetInt32(z, &
f4a0: 69 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i) ){.      if( 
f4b0: 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69  negFlag ) i = -i
f4c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f4d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f4e0: 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d  Integer, i, iMem
f4f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
f500: 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34   sqlite3FitsIn64
f510: 42 69 74 73 28 7a 2c 20 6e 65 67 46 6c 61 67 29  Bits(z, negFlag)
f520: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 76 61   ){.      i64 va
f530: 6c 75 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20  lue;.      char 
f540: 2a 7a 56 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  *zV;.      sqlit
f550: 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 61 6c  e3Atoi64(z, &val
f560: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ue);.      if( n
f570: 65 67 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  egFlag ) value =
f580: 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a   -value;.      z
f590: 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
f5a0: 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
f5b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f5c0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49  beAddOp4(v, OP_I
f5d0: 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
f5e0: 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b  , zV, P4_INT64);
f5f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f600: 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
f610: 20 6e 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65   n, negFlag, iMe
f620: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  m);.    }.  }.}.
f630: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f640: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
f650: 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
f660: 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
f670: 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
f680: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63   and store the c
f690: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61  olumn value in a
f6a0: 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65   register.  An e
f6b0: 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65  ffort.** is made
f6c0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f   to store the co
f6d0: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65  lumn value in re
f6e0: 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74  gister iReg, but
f6f0: 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20   this is.** not 
f700: 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65  guaranteed.  The
f710: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
f720: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73   column value is
f730: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
f740: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
f750: 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f  n open cursor to
f760: 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20   pTab in iTable 
f770: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
f780: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  e.** is called. 
f790: 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68   If iColumn<0 th
f7a0: 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  en code is gener
f7b0: 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
f7c0: 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a  ts the rowid..**
f7d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f7e0: 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74   might attempt t
f7f0: 6f 20 72 65 75 73 65 20 74 68 65 20 76 61 6c 75  o reuse the valu
f800: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
f810: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 6c 72 65  that.** has alre
f820: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  ady been loaded 
f830: 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
f840: 20 20 54 68 65 20 76 61 6c 75 65 20 77 69 6c 6c    The value will
f850: 20 61 6c 77 61 79 73 0a 2a 2a 20 62 65 20 75 73   always.** be us
f860: 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
f870: 20 75 6e 64 65 72 67 6f 6e 65 20 61 6e 79 20 61   undergone any a
f880: 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 73 2e  ffinity changes.
f890: 20 20 42 75 74 20 69 66 0a 2a 2a 20 61 6e 20 61    But if.** an a
f8a0: 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
f8b0: 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  as occurred, the
f8c0: 6e 20 74 68 65 20 63 61 63 68 65 64 20 76 61 6c  n the cached val
f8d0: 75 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 0a  ue will only be.
f8e0: 2a 2a 20 75 73 65 64 20 69 66 20 61 6c 6c 6f 77  ** used if allow
f8f0: 41 66 66 43 68 6e 67 20 69 73 20 74 72 75 65 2e  AffChng is true.
f900: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f910: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
f920: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f930: 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
f940: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
f950: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f960: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
f970: 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
f980: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
f990: 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
f9a0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
f9b0: 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
f9c0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
f9d0: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
f9e0: 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
f9f0: 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
fa00: 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
fa10: 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
fa20: 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
fa30: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
fa40: 69 6e 74 20 61 6c 6c 6f 77 41 66 66 43 68 6e 67  int allowAffChng
fa50: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 72 69 6f   /* True if prio
fa60: 72 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  r affinity chang
fa70: 65 73 20 61 72 65 20 4f 4b 20 2a 2f 0a 29 7b 0a  es are OK */.){.
fa80: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
fa90: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
faa0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
fab0: 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
fac0: 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
fad0: 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 70 50  >aColCache; i<pP
fae0: 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b  arse->nColCache;
faf0: 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
fb00: 69 66 28 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69  if( p->iTable==i
fb10: 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
fb20: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
fb30: 20 20 20 20 20 20 20 20 26 26 20 28 21 70 2d 3e          && (!p->
fb40: 61 66 66 43 68 61 6e 67 65 20 7c 7c 20 61 6c 6c  affChange || all
fb50: 6f 77 41 66 66 43 68 6e 67 29 20 29 7b 0a 23 69  owAffChng) ){.#i
fb60: 66 20 30 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f 0.      sqlite
fb70: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
fb80: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 56  P_Noop);.      V
fb90: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
fba0: 4f 50 54 3a 20 74 61 62 25 64 2e 63 6f 6c 25 64  OPT: tab%d.col%d
fbb0: 20 2d 3e 20 72 25 64 22 2c 20 69 54 61 62 6c 65   -> r%d", iTable
fbc0: 2c 20 69 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 69 52  , iColumn, p->iR
fbd0: 65 67 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eg));.#endif.   
fbe0: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65     return p->iRe
fbf0: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  g;.    }.  }  . 
fc00: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
fc10: 0a 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30  .  if( iColumn<0
fc20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
fc30: 20 28 70 54 61 62 20 26 26 20 49 73 56 69 72 74   (pTab && IsVirt
fc40: 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f 50 5f  ual(pTab)) ? OP_
fc50: 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69  VRowid : OP_Rowi
fc60: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  d;.    sqlite3Vd
fc70: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
fc80: 69 54 61 62 6c 65 2c 20 69 52 65 67 29 3b 0a 20  iTable, iReg);. 
fc90: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 3d   }else if( pTab=
fca0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
fcb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fcc0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65  P_Column, iTable
fcd0: 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
fce0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
fcf0: 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
fd00: 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
fd10: 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
fd20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fd30: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
fd40: 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
fd50: 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  iReg);.    sqlit
fd60: 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
fd70: 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e  v, pTab, iColumn
fd80: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
fd90: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
fda0: 50 4f 49 4e 54 0a 20 20 20 20 69 66 28 20 70 54  POINT.    if( pT
fdb0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  ab->aCol[iColumn
fdc0: 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
fdd0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20  TE_AFF_REAL ){. 
fde0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fdf0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61  AddOp1(v, OP_Rea
fe00: 6c 41 66 66 69 6e 69 74 79 2c 20 69 52 65 67 29  lAffinity, iReg)
fe10: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
fe20: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
fe30: 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
fe40: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 20 3d 20 70  ==0 ){.    i = p
fe50: 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68 65  Parse->iColCache
fe60: 3b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72 73  ;.    p = &pPars
fe70: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 3b  e->aColCache[i];
fe80: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
fe90: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e   iTable;.    p->
fea0: 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d  iColumn = iColum
feb0: 6e 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  n;.    p->iReg =
fec0: 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 61 66   iReg;.    p->af
fed0: 66 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  fChange = 0;.   
fee0: 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 3e   i++;.    if( i>
fef0: 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 72 73  =ArraySize(pPars
ff00: 65 2d 3e 61 43 6f 6c 43 61 63 68 65 29 20 29 20  e->aColCache) ) 
ff10: 69 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  i = 0;.    if( i
ff20: 3e 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63  >pParse->nColCac
ff30: 68 65 20 29 20 70 50 61 72 73 65 2d 3e 6e 43 6f  he ) pParse->nCo
ff40: 6c 43 61 63 68 65 20 3d 20 69 3b 0a 20 20 20 20  lCache = i;.    
ff50: 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68  pParse->iColCach
ff60: 65 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  e = i;.  }.  ret
ff70: 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  urn iReg;.}../*.
ff80: 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c  ** Clear all col
ff90: 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69 65  umn cache entrie
ffa0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
ffb0: 68 20 74 68 65 20 76 64 62 65 0a 2a 2a 20 63 75  h the vdbe.** cu
ffc0: 72 73 6f 72 20 77 69 74 68 20 63 75 72 73 6f 72  rsor with cursor
ffd0: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 2e 0a   number iTable..
ffe0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
fff0: 78 70 72 43 6c 65 61 72 43 6f 6c 75 6d 6e 43 61  xprClearColumnCa
10000 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
10010 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  e, int iTable){.
10020 20 20 69 66 28 20 69 54 61 62 6c 65 3c 30 20 29    if( iTable<0 )
10030 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 43  {.    pParse->nC
10040 6f 6c 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  olCache = 0;.   
10050 20 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63   pParse->iColCac
10060 68 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  he = 0;.  }else{
10070 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10080 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
10090 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
100a0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50  +){.      if( pP
100b0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
100c0 69 5d 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  i].iTable==iTabl
100d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  e ){.        tes
100e0 74 63 61 73 65 28 20 69 3d 3d 70 50 61 72 73 65  tcase( i==pParse
100f0 2d 3e 6e 43 6f 6c 43 61 63 68 65 2d 31 20 29 3b  ->nColCache-1 );
10100 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
10110 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 20 3d 20  >aColCache[i] = 
10120 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10130 65 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  e[--pParse->nCol
10140 43 61 63 68 65 5d 3b 0a 20 20 20 20 20 20 20 20  Cache];.        
10150 70 50 61 72 73 65 2d 3e 69 43 6f 6c 43 61 63 68  pParse->iColCach
10160 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  e = pParse->nCol
10170 43 61 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20  Cache;.      }. 
10180 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
10190 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
101a0 74 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69  t that an affini
101b0 74 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63  ty change has oc
101c0 63 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74  curred on iCount
101d0 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74  .** registers st
101e0 61 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61  arting with iSta
101f0 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rt..*/.void sqli
10200 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
10210 6e 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65  nityChange(Parse
10220 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53   *pParse, int iS
10230 74 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74  tart, int iCount
10240 29 7b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  ){.  int iEnd = 
10250 69 53 74 61 72 74 20 2b 20 69 43 6f 75 6e 74 20  iStart + iCount 
10260 2d 20 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  - 1;.  int i;.  
10270 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
10280 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 69 2b  e->nColCache; i+
10290 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
102a0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
102b0 65 5b 69 5d 2e 69 52 65 67 3b 0a 20 20 20 20 69  e[i].iReg;.    i
102c0 66 28 20 72 3e 3d 69 53 74 61 72 74 20 26 26 20  f( r>=iStart && 
102d0 72 3c 3d 69 45 6e 64 20 29 7b 0a 20 20 20 20 20  r<=iEnd ){.     
102e0 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
102f0 68 65 5b 69 5d 2e 61 66 66 43 68 61 6e 67 65 20  he[i].affChange 
10300 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 1;.    }.  }.}
10310 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
10320 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 73 20 63   code to moves c
10330 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 6f 6e 65 20  ontent from one 
10340 72 65 67 69 73 74 65 72 20 74 6f 20 61 6e 6f 74  register to anot
10350 68 65 72 2e 0a 2a 2a 20 4b 65 65 70 20 74 68 65  her..** Keep the
10360 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70   column cache up
10370 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  -to-date..*/.voi
10380 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
10390 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  eMove(Parse *pPa
103a0 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
103b0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
103c0 69 3b 0a 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d  i;.  if( iFrom==
103d0 69 54 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  iTo ) return;.  
103e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
103f0 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
10400 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
10410 20 69 54 6f 29 3b 0a 20 20 66 6f 72 28 69 3d 30   iTo);.  for(i=0
10420 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
10430 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  Cache; i++){.   
10440 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
10450 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3d 3d  lCache[i].iReg==
10460 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
10470 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
10480 5b 69 5d 2e 69 52 65 67 20 3d 20 69 54 6f 3b 0a  [i].iReg = iTo;.
10490 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
104a0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
104b0 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
104c0 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
104d0 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
104e0 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
104f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
10500 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  umn cache..*/.st
10510 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
10520 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
10530 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
10540 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
10550 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
10560 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f  0; i<pParse->nCo
10570 6c 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20  lCache; i++){.  
10580 20 20 69 6e 74 20 72 20 3d 20 70 50 61 72 73 65    int r = pParse
10590 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69  ->aColCache[i].i
105a0 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
105b0 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20  iFrom && r<=iTo 
105c0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
105d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
105e0 2a 0a 2a 2a 20 54 68 65 72 65 73 20 69 73 20 61  *.** Theres is a
105f0 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
10600 65 72 20 69 43 75 72 72 65 6e 74 2e 20 20 57 65  er iCurrent.  We
10610 20 75 6c 74 69 6d 61 74 65 6c 79 20 77 61 6e 74   ultimately want
10620 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 74 6f  .** the value to
10630 20 62 65 20 69 6e 20 72 65 67 69 73 74 65 72 20   be in register 
10640 69 54 61 72 67 65 74 2e 20 20 49 74 20 6d 69 67  iTarget.  It mig
10650 68 74 20 62 65 20 74 68 61 74 0a 2a 2a 20 69 43  ht be that.** iC
10660 75 72 72 65 6e 74 20 61 6e 64 20 69 54 61 72 67  urrent and iTarg
10670 65 74 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  et are the same 
10680 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
10690 57 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  We are going to 
106a0 6d 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75 65  modify the value
106b0 2c 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20  , so we need to 
106c0 6d 61 6b 65 20 73 75 72 65 20 69 74 0a 2a 2a 20  make sure it.** 
106d0 69 73 20 6e 6f 74 20 61 20 63 61 63 68 65 64 20  is not a cached 
106e0 72 65 67 69 73 74 65 72 2e 20 20 49 66 20 69 43  register.  If iC
106f0 75 72 72 65 6e 74 20 69 73 20 61 20 63 61 63 68  urrent is a cach
10700 65 64 20 72 65 67 69 73 74 65 72 2c 0a 2a 2a 20  ed register,.** 
10710 74 68 65 6e 20 74 72 79 20 74 6f 20 6d 6f 76 65  then try to move
10720 20 74 68 65 20 76 61 6c 75 65 20 6f 76 65 72 20   the value over 
10730 74 6f 20 69 54 61 72 67 65 74 2e 20 20 49 66 20  to iTarget.  If 
10740 69 54 61 72 67 65 74 20 69 73 20 61 0a 2a 2a 20  iTarget is a.** 
10750 63 61 63 68 65 64 20 72 65 67 69 73 74 65 72 2c  cached register,
10760 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20   then clear the 
10770 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 61  corresponding ca
10780 63 68 65 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20  che line..**.** 
10790 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
107a0 74 65 72 20 74 68 61 74 20 74 68 65 20 76 61 6c  ter that the val
107b0 75 65 20 65 6e 64 73 20 75 70 20 69 6e 2e 0a 2a  ue ends up in..*
107c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
107d0 72 57 72 69 74 61 62 6c 65 52 65 67 69 73 74 65  rWritableRegiste
107e0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
107f0 20 69 6e 74 20 69 43 75 72 72 65 6e 74 2c 20 69   int iCurrent, i
10800 6e 74 20 69 54 61 72 67 65 74 29 7b 0a 20 20 69  nt iTarget){.  i
10810 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
10820 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
10830 20 29 3b 0a 20 20 69 66 28 20 21 75 73 65 64 41   );.  if( !usedA
10840 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
10850 72 73 65 2c 20 69 43 75 72 72 65 6e 74 2c 20 69  rse, iCurrent, i
10860 43 75 72 72 65 6e 74 29 20 29 7b 0a 20 20 20 20  Current) ){.    
10870 72 65 74 75 72 6e 20 69 43 75 72 72 65 6e 74 3b  return iCurrent;
10880 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 75 72 72  .  }.  if( iCurr
10890 65 6e 74 21 3d 69 54 61 72 67 65 74 20 29 7b 0a  ent!=iTarget ){.
108a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
108b0 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
108c0 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  dbe, OP_SCopy, i
108d0 43 75 72 72 65 6e 74 2c 20 69 54 61 72 67 65 74  Current, iTarget
108e0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
108f0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c  ; i<pParse->nCol
10900 43 61 63 68 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  Cache; i++){.   
10910 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 43 6f   if( pParse->aCo
10920 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65 67 3d 3d  lCache[i].iReg==
10930 69 54 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  iTarget ){.     
10940 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63   pParse->aColCac
10950 68 65 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e  he[i] = pParse->
10960 61 43 6f 6c 43 61 63 68 65 5b 2d 2d 70 50 61 72  aColCache[--pPar
10970 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 5d 3b 0a  se->nColCache];.
10980 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 43        pParse->iC
10990 6f 6c 43 61 63 68 65 20 3d 20 70 50 61 72 73 65  olCache = pParse
109a0 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 20 20 20  ->nColCache;.   
109b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
109c0 69 54 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  iTarget;.}../*.*
109d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
109e0 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
109f0 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
10a00 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
10a10 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74 65  xpression.  Atte
10a20 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  mpt to store the
10a30 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69   results in regi
10a40 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a 2a  ster "target"..*
10a50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
10a60 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73 75  ister where resu
10a70 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  lts are stored..
10a80 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73 20  **.** With this 
10a90 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20 69  routine, there i
10aa0 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 64 20  s no guaranteed 
10ab0 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
10ac0 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
10ad0 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
10ae0 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
10af0 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
10b00 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
10b10 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
10b20 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
10b30 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
10b40 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
10b50 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
10b60 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
10b70 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
10b80 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
10b90 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
10ba0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
10bb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
10bc0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
10bd0 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
10be0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10bf0 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
10c00 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10c10 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
10c40 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
10c50 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
10c60 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
10c70 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
10c80 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
10c90 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
10ca0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
10cb0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
10cc0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
10cd0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
10ce0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
10cf0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
10d00 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
10d10 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
10d20 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
10d30 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20 20   r2, r3, r4;    
10d40 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
10d50 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
10d60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  /..  assert( v!=
10d70 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
10d80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
10d90 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
10da0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
10db0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
10dc0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
10dd0 72 6e 20 30 3b 0a 0a 20 20 69 66 28 20 70 45 78  rn 0;..  if( pEx
10de0 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
10df0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
10e00 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
10e10 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
10e20 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
10e30 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
10e40 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
10e50 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
10e60 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
10e70 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
10e80 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
10e90 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
10ea0 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
10eb0 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
10ec0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
10ed0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
10ee0 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
10ef0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
10f00 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
10f10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10f20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
10f30 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
10f40 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
10f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10f60 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
10f70 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
10f80 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
10fb0 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
10fc0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
10fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10fe0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
10ff0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
11000 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
11010 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
11020 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
11030 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
11040 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
11050 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79      /* This only
11060 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
11070 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e 73 74  ding check const
11080 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
11090 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
110a0 2d 3e 63 6b 42 61 73 65 3e 30 20 29 3b 0a 20 20  ->ckBase>0 );.  
110b0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
110c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70  xpr->iColumn + p
110d0 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20  Parse->ckBase;. 
110e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
110f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
11100 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
11110 5f 41 6e 79 41 66 66 29 21 3d 30 20 29 3b 0a 20  _AnyAff)!=0 );. 
11120 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73         inReg = s
11130 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
11140 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
11150 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20  pExpr->pTab,.   
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
11180 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45  xpr->iColumn, pE
11190 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72  xpr->iTable, tar
111a0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
111d0 67 73 20 26 20 45 50 5f 41 6e 79 41 66 66 29 3b  gs & EP_AnyAff);
111e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
111f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11200 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
11210 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
11220 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29 70  eger(v, (char*)p
11230 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
11240 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
11250 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
11260 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11270 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
11280 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61   {.      codeRea
11290 6c 28 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70  l(v, (char*)pExp
112a0 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
112b0 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 2c 20 74  r->token.n, 0, t
112c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
112d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
112e0 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
112f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
11300 71 75 6f 74 65 45 78 70 72 28 70 50 61 72 73 65  quoteExpr(pParse
11310 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  ->db, pExpr);.  
11320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11330 64 64 4f 70 34 28 76 2c 4f 50 5f 53 74 72 69 6e  ddOp4(v,OP_Strin
11340 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30  g8, 0, target, 0
11350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11360 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
11370 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
11380 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
11390 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
113a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
113b0 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
113c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
113d0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
113e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
113f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
11400 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11410 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
11420 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
11430 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
11440 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11450 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  z;.      char *z
11460 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65  Blob;.      asse
11470 72 74 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  rt( pExpr->token
11480 2e 6e 3e 3d 33 20 29 3b 0a 20 20 20 20 20 20 61  .n>=3 );.      a
11490 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 74 6f  ssert( pExpr->to
114a0 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c  ken.z[0]=='x' ||
114b0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
114c0 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
114d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
114e0 74 6f 6b 65 6e 2e 7a 5b 31 5d 3d 3d 27 5c 27 27  token.z[1]=='\''
114f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11500 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
11510 5b 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d  [pExpr->token.n-
11520 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
11530 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b    n = pExpr->tok
11540 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20  en.n - 3;.      
11550 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72  z = (char*)pExpr
11560 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20  ->token.z + 2;. 
11570 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
11580 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
11590 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
115a0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
115b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
115c0 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
115d0 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
115e0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
115f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11600 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
11610 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
11620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11630 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56  beAddOp2(v, OP_V
11640 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
11650 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b  iTable, target);
11660 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
11670 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20  ->token.n>1 ){. 
11680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11690 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
116a0 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  , (char*)pExpr->
116b0 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
116c0 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
116d0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
116e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
116f0 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
11700 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
11710 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
11720 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
11730 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11740 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
11750 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
11760 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
11770 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
11780 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
11790 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  n) */.      int 
117a0 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20  aff, to_op;.    
117b0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
117c0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
117d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
117e0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
117f0 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
11800 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 26  e3AffinityType(&
11810 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  pExpr->token);. 
11820 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66       to_op = aff
11830 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   - SQLITE_AFF_TE
11840 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a  XT + OP_ToText;.
11850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
11860 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20  _op==OP_ToText  
11870 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
11880 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a  _AFF_TEXT    );.
11890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
118a0 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20  _op==OP_ToBlob  
118b0 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
118c0 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a  _AFF_NONE    );.
118d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
118e0 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69  _op==OP_ToNumeri
118f0 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45  c || aff!=SQLITE
11900 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
11910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
11920 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20  _op==OP_ToInt   
11930 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
11940 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
11950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 74 6f        assert( to
11960 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20  _op==OP_ToReal  
11970 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45    || aff!=SQLITE
11980 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a  _AFF_REAL    );.
11990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
119a0 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
119b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
119c0 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f  se( to_op==OP_To
119d0 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 74 65  Blob );.      te
119e0 73 74 63 61 73 65 28 20 74 6f 5f 6f 70 3d 3d 4f  stcase( to_op==O
119f0 50 5f 54 6f 4e 75 6d 65 72 69 63 20 29 3b 0a 20  P_ToNumeric );. 
11a00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 74       testcase( t
11a10 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 29  o_op==OP_ToInt )
11a20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11a30 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65  ( to_op==OP_ToRe
11a40 61 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  al );.      sqli
11a50 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11a60 20 74 6f 5f 6f 70 2c 20 69 6e 52 65 67 29 3b 0a   to_op, inReg);.
11a70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11a80 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
11a90 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
11aa0 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20   inReg) );.     
11ab0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11ac0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
11ad0 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31  pParse, inReg, 1
11ae0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
11af0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
11b00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
11b10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
11b20 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
11b30 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
11b40 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
11b50 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
11b60 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
11b70 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
11b80 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
11b90 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11ba0 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
11bb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11bc0 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
11bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
11be0 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
11bf0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
11c00 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
11c10 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
11c20 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
11c30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
11c40 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _LT );.      tes
11c50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45  tcase( op==TK_LE
11c60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11c70 73 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b  se( op==TK_GT );
11c80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11c90 20 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20   op==TK_GE );.  
11ca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
11cb0 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==TK_EQ );.     
11cc0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
11cd0 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 63 6f  K_NE );.      co
11ce0 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64  deCompareOperand
11cf0 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
11d00 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65  >pLeft, &r1, &re
11d10 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20  gFree1,.        
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
11d40 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72  >pRight, &r2, &r
11d50 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
11d60 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
11d70 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
11d80 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
11d90 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
11da0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
11db0 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
11dc0 52 45 50 32 29 3b 0a 20 20 20 20 20 20 74 65 73  REP2);.      tes
11dd0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
11de0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
11df0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
11e00 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
11e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11e20 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
11e30 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
11e40 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
11e50 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
11e60 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
11e70 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
11e80 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
11e90 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
11ea0 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
11eb0 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
11ec0 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
11ed0 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
11ee0 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
11ef0 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
11f00 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
11f10 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
11f20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
11f30 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
11f40 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
11f50 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
11f60 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
11f70 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
11f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
11f90 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
11fa0 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
11fb0 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
11fc0 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
11fd0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
11fe0 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
11ff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
12000 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
12010 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
12020 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
12030 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
12040 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
12050 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
12060 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
12070 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
12080 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
12090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
120a0 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
120b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
120c0 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 74  TK_OR );.      t
120d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
120e0 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65  PLUS );.      te
120f0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d  stcase( op==TK_M
12100 49 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 74 65  INUS );.      te
12110 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
12120 45 4d 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EM );.      test
12130 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
12140 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73  AND );.      tes
12150 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
12160 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 74 65 73  TOR );.      tes
12170 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
12180 41 53 48 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ASH );.      tes
12190 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53  tcase( op==TK_LS
121a0 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74 65  HIFT );.      te
121b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
121c0 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 74  SHIFT );.      t
121d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
121e0 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
121f0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
12200 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
12210 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
12220 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
12230 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
12240 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
12250 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
12260 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
12270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12280 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
12290 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
122a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
122b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
122c0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
122d0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
122e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
122f0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
12300 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
12310 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
12320 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
12330 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
12340 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
12350 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c  ==TK_FLOAT || pL
12360 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
12370 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54  GER ){.        T
12380 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74  oken *p = &pLeft
12390 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
123a0 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
123b0 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
123c0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
123d0 2c 20 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 70  , (char*)p->z, p
123e0 2d 3e 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ->n, 1, target);
123f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12400 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e            codeIn
12410 74 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29  teger(v, (char*)
12420 70 2d 3e 7a 2c 20 70 2d 3e 6e 2c 20 31 2c 20 74  p->z, p->n, 1, t
12430 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
12440 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
12450 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
12460 3d 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  = r1 = sqlite3Ge
12470 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12480 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12490 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
124a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 31  P_Integer, 0, r1
124b0 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
124c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
124d0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
124e0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
124f0 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee2);.        sq
12500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12510 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
12520 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b  r2, r1, target);
12530 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
12540 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
12550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12560 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
12570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12580 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
12590 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
125a0 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
125b0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f  assert( TK_BITNO
125c0 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a  T==OP_BitNot );.
125d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
125e0 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a  _NOT==OP_Not );.
125f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12600 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
12610 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12620 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20   op==TK_NOT );. 
12630 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
12640 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
12650 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
12660 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
12670 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
12680 28 20 69 6e 52 65 67 3d 3d 74 61 72 67 65 74 20  ( inReg==target 
12690 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
126a0 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
126b0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
126c0 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
126d0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
126e0 74 65 33 45 78 70 72 57 72 69 74 61 62 6c 65 52  te3ExprWritableR
126f0 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
12700 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a  inReg, target);.
12710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12720 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 69  eAddOp1(v, op, i
12730 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
12740 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
12750 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
12760 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
12770 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
12780 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
12790 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
127a0 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
127b0 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
127c0 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
127d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
127e0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  e( op==TK_ISNULL
127f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12800 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
12810 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
12820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12830 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12840 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
12850 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
12860 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
12870 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
12880 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
12890 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
128a0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
128b0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
128c0 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
128d0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
128e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
128f0 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
12900 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , -1);.      sql
12910 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
12920 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
12930 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12940 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
12950 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
12960 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
12970 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
12980 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
12990 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
129a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
129b0 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
129c0 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54  of aggregate: %T
129d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ",.            &
129e0 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
129f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12a00 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f     inReg = pInfo
12a10 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
12a20 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
12a30 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12a40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
12a50 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
12a60 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
12a70 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
12a80 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
12a90 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
12aa0 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c    int nExpr = pL
12ab0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
12ac0 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75  pr : 0;.      Fu
12ad0 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
12ae0 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20     int nId;.    
12af0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
12b00 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  d;.      int con
12b10 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  stMask = 0;.    
12b20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73    int i;.      s
12b30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12b40 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 75  rse->db;.      u
12b50 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
12b60 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
12b70 70 43 6f 6c 6c 20 3d 20 30 3b 0a 0a 20 20 20 20  pColl = 0;..    
12b80 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
12b90 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b  TK_CONST_FUNC );
12ba0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12bb0 20 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e   op==TK_FUNCTION
12bc0 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
12bd0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
12be0 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64  ken.z;.      nId
12bf0 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
12c00 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
12c10 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
12c20 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
12c30 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
12c40 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
12c50 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
12c60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
12c70 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  st ){.        nE
12c80 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
12c90 70 72 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  pr;.        r1 =
12ca0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12cb0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
12cc0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
12cd0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
12ce0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
12cf0 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  st, r1);.      }
12d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 45  else{.        nE
12d10 78 70 72 20 3d 20 72 31 20 3d 20 30 3b 0a 20 20  xpr = r1 = 0;.  
12d20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
12d30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12d40 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
12d50 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
12d60 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
12d70 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
12d80 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
12d90 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
12da0 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
12db0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
12dc0 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
12dd0 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
12de0 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
12df0 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
12e00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
12e10 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
12e20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
12e30 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
12e40 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
12e50 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
12e60 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
12e70 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
12e80 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
12e90 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
12ea0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
12eb0 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
12ec0 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
12ed0 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
12ee0 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
12ef0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
12f00 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
12f10 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
12f20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
12f30 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
12f40 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
12f50 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
12f60 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
12f70 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
12f80 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
12f90 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
12fa0 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
12fb0 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
12fc0 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
12fd0 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
12fe0 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 70 72  .      if( nExpr
12ff0 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
13000 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
13010 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
13020 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
13030 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
13040 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 45 78  on(db, pDef, nEx
13050 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr, pList->a[1].
13060 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
13070 6c 73 65 20 69 66 28 20 6e 45 78 70 72 3e 30 20  lse if( nExpr>0 
13080 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
13090 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
130a0 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
130b0 2c 20 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70  , pDef, nExpr, p
130c0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
130d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
130e0 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  f.      for(i=0;
130f0 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32   i<nExpr && i<32
13100 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13110 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
13120 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d  sConstant(pList-
13130 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
13140 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
13150 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20  ask |= (1<<i);. 
13160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13170 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
13180 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c  ollSeq && !pColl
13190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
131a0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
131b0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
131c0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
131d0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
131e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
131f0 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
13200 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  eq ){.        if
13210 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
13220 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
13230 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
13240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13250 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
13260 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
13270 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
13280 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
13290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
132a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46  beAddOp4(v, OP_F
132b0 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61  unction, constMa
132c0 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a  sk, r1, target,.
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
132f0 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
13300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13310 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e  dbeChangeP5(v, n
13320 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
13330 20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20   nExpr ){.      
13340 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
13350 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13360 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20 20  , r1, nExpr);.  
13370 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13380 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
13390 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
133a0 65 2c 20 72 31 2c 20 6e 45 78 70 72 29 3b 0a 20  e, r1, nExpr);. 
133b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
133c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
133d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
133e0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
133f0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
13400 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
13410 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
13420 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
13430 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
13440 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
13450 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
13460 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
13470 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
13480 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
13490 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
134a0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
134b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
134c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
134d0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
134e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 2c 20  {.      int j1, 
134f0 6a 32 2c 20 6a 33 2c 20 6a 34 2c 20 6a 35 3b 0a  j2, j3, j4, j5;.
13500 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
13510 69 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 65  ity;.      int e
13520 54 79 70 65 3b 0a 0a 20 20 20 20 20 20 65 54 79  Type;..      eTy
13530 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
13540 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
13550 70 45 78 70 72 2c 20 30 29 3b 0a 0a 20 20 20 20  pExpr, 0);..    
13560 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
13570 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
13580 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
13590 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
135a0 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
135b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
135c0 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
135d0 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
135e0 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
135f0 0a 20 20 20 20 20 20 2a 2a 20 50 34 20 6f 66 20  .      ** P4 of 
13600 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
13610 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
13620 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
13630 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
13640 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  r);..      sqlit
13650 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13660 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
13670 61 72 67 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  arget);..      /
13680 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
13690 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
136a0 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
136b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
136c0 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
136d0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
136e0 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
136f0 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
13700 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
13710 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
13720 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
13730 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
13740 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
13750 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13760 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
13770 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
13780 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
13790 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 0a 20  _NotNull, r1);. 
137a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
137b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
137c0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
137d0 20 20 20 20 20 6a 32 20 20 3d 20 73 71 6c 69 74       j2  = sqlit
137e0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
137f0 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20  OP_Goto);.      
13800 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13810 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
13820 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
13830 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
13840 20 20 20 20 20 20 20 6a 33 20 3d 20 73 71 6c 69         j3 = sqli
13850 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13860 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
13870 31 29 3b 0a 20 20 20 20 20 20 20 20 6a 34 20 3d  1);.        j4 =
13880 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13890 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
138a0 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
138b0 65 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 20  e, 0, r1);.     
138c0 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56     j5 = sqlite3V
138d0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
138e0 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Goto);.        s
138f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13900 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20 20  re(v, j3);.     
13910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
13920 6d 70 48 65 72 65 28 76 2c 20 6a 34 29 3b 0a 20  mpHere(v, j4);. 
13930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13940 20 20 20 20 72 32 20 3d 20 72 65 67 46 72 65 65      r2 = regFree
13950 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
13960 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
13970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13980 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
13990 61 6b 65 52 65 63 6f 72 64 2c 20 72 31 2c 20 31  akeRecord, r1, 1
139a0 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
139b0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
139c0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
139d0 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
139e0 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  se, r1, 1);.    
139f0 20 20 20 20 6a 35 20 3d 20 73 71 6c 69 74 65 33      j5 = sqlite3
13a00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13a10 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
13a20 54 61 62 6c 65 2c 20 30 2c 20 72 32 29 3b 0a 20  Table, 0, r2);. 
13a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13a50 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
13a60 67 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  get, -1);.      
13a70 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13a80 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20  ere(v, j2);.    
13a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13aa0 70 48 65 72 65 28 76 2c 20 6a 35 29 3b 0a 20 20  pHere(v, j5);.  
13ab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13ac0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 0a 20  .#endif.    /*. 
13ad0 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
13ae0 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
13af0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
13b00 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
13b10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
13b20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
13b30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
13b40 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
13b50 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
13b60 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
13b70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
13b80 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
13b90 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
13ba0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
13bb0 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
13bc0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
13bd0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
13be0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
13bf0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
13c00 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13c10 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
13c20 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20  xpr->pList->a;. 
13c30 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
13c40 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
13c50 72 3b 0a 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  r;..      codeCo
13c60 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
13c70 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 31  arse, pLeft, &r1
13c80 2c 20 26 72 65 67 46 72 65 65 31 2c 0a 20 20 20  , &regFree1,.   
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13cb0 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67  Right, &r2, &reg
13cc0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65  Free2);.      te
13cd0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
13ce0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
13cf0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
13d00 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d  =0 );.      r3 =
13d10 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13d20 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
13d30 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65    r4 = sqlite3Ge
13d40 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
13d50 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
13d60 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
13d70 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
13d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13d90 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20      r1, r2, r3, 
13da0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
13db0 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
13dc0 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
13dd0 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
13de0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
13df0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
13e00 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20  e, regFree2);.  
13e10 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
13e20 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
13e30 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
13e40 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
13e50 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
13e60 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  2==0 );.      co
13e70 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
13e80 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
13e90 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c 20   OP_Le, r1, r2, 
13ea0 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r4, SQLITE_STORE
13eb0 50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  P2);.      sqlit
13ec0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13ed0 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20  OP_And, r3, r4, 
13ee0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
13ef0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13f00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
13f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
13f20 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13f30 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20  arse, r4);.     
13f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13f50 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
13f60 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
13f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
13f80 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
13f90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
13fa0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
13fb0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
13fc0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
13fd0 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
13fe0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
13ff0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
14000 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
14010 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
14020 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
14030 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
14040 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
14050 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
14060 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
14070 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
14080 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
14090 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
140a0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
140b0 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
140c0 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
140d0 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
140e0 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
140f0 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
14100 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
14110 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
14120 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
14130 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
14140 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
14150 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
14160 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
14170 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 52   is in pExpr->pR
14180 69 67 68 74 2e 20 20 54 68 65 20 59 20 69 73 20  ight.  The Y is 
14190 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
141a0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 0a 20  If there is no. 
141b0 20 20 20 2a 2a 20 45 4c 53 45 20 63 6c 61 75 73     ** ELSE claus
141c0 65 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 74  e and no other t
141d0 65 72 6d 20 6d 61 74 63 68 65 73 2c 20 74 68 65  erm matches, the
141e0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
141f0 74 68 65 0a 20 20 20 20 2a 2a 20 65 78 70 72 73  the.    ** exprs
14200 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20  sion is NULL..  
14210 20 20 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45    ** Ei is in pE
14220 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a  xpr->pList->a[i*
14230 32 5d 20 61 6e 64 20 52 69 20 69 73 20 70 45 78  2] and Ri is pEx
14240 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32  pr->pList->a[i*2
14250 2b 31 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  +1]..    **.    
14260 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  ** The result of
14270 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
14280 69 73 20 74 68 65 20 52 69 20 66 6f 72 20 74 68  is the Ri for th
14290 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
142a0 20 45 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69   Ei,.    ** or i
142b0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
142c0 74 63 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45  tching Ei, the E
142d0 4c 53 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69  LSE term Y, or i
142e0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a  f there is.    *
142f0 2a 20 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20  * no ELSE term, 
14300 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
14310 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
14320 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
14330 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
14340 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
14350 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
14360 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
14370 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
14380 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
14390 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
143a0 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
143b0 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
143c0 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
143f0 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
14400 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
14430 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
14440 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
14450 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
14460 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
14470 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
14480 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
14490 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
144a0 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
144b0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
144c0 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
144d0 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
144e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
144f0 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
14500 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 63   */.      Expr c
14510 61 63 68 65 58 3b 20 20 20 20 20 20 20 20 20 20  acheX;          
14520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14530 61 63 68 65 64 20 65 78 70 72 65 73 73 69 6f 6e  ached expression
14540 20 58 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72   X */.      Expr
14550 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14570 20 54 68 65 20 58 20 65 78 70 72 65 73 73 69 6f   The X expressio
14580 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
14590 2a 70 54 65 73 74 3b 20 20 20 20 20 20 20 20 20  *pTest;         
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
145b0 58 3d 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f  X==Ei (form A) o
145c0 72 20 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20  r just Ei (form 
145d0 42 29 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  B) */..      ass
145e0 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
145f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14600 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
14610 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
14620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
14630 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
14640 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
14650 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
14660 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
14670 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
14680 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
14690 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
146a0 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d 20       endLabel = 
146b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
146c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
146d0 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d 3e  f( (pX = pExpr->
146e0 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20 20  pLeft)!=0 ){.   
146f0 20 20 20 20 20 63 61 63 68 65 58 20 3d 20 2a 70       cacheX = *p
14700 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
14710 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
14720 43 4f 4c 55 4d 4e 20 7c 7c 20 70 58 2d 3e 6f 70  COLUMN || pX->op
14730 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b  ==TK_REGISTER );
14740 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 58 2e  .        cacheX.
14750 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
14760 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
14770 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
14780 65 31 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e1);.        tes
14790 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
147a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 61  =0 );.        ca
147b0 63 68 65 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47  cheX.op = TK_REG
147c0 49 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20 63  ISTER;.        c
147d0 61 63 68 65 58 2e 69 43 6f 6c 75 6d 6e 20 3d 20  acheX.iColumn = 
147e0 30 3b 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  0;.        opCom
147f0 70 61 72 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b  pare.op = TK_EQ;
14800 0a 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61  .        opCompa
14810 72 65 2e 70 4c 65 66 74 20 3d 20 26 63 61 63 68  re.pLeft = &cach
14820 65 58 3b 0a 20 20 20 20 20 20 20 20 70 54 65 73  eX;.        pTes
14830 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72 65 3b 0a  t = &opCompare;.
14840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
14850 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
14860 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 66  Cache++;.      f
14870 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
14880 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
14890 20 69 66 28 20 70 58 20 29 7b 0a 20 20 20 20 20   if( pX ){.     
148a0 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
148b0 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c 65  Right = aListele
148c0 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  m[i].pExpr;.    
148d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
148e0 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c 69       pTest = aLi
148f0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
14900 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14910 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73 71     nextCase = sq
14920 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14930 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  el(v);.        t
14940 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d 3e  estcase( pTest->
14950 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
14960 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 52   pTest->op==TK_R
14970 45 47 49 53 54 45 52 20 29 3b 0a 20 20 20 20 20  EGISTER );.     
14980 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
14990 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
149a0 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
149b0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
149c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
149d0 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
149e0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
149f0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
14a00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c      testcase( aL
14a10 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78  istelem[i+1].pEx
14a20 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  pr->op==TK_REGIS
14a30 54 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20 73  TER );.        s
14a40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
14a50 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
14a60 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
14a70 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
14a80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14a90 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
14aa0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
14ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14ac0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65 78  olveLabel(v, nex
14ad0 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  tCase);.      }.
14ae0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
14af0 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
14b00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14b10 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
14b20 2d 3e 70 52 69 67 68 74 2c 20 74 61 72 67 65 74  ->pRight, target
14b30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14b50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14b60 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
14b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14b80 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14b90 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
14ba0 62 65 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  bel);.      asse
14bb0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  rt( pParse->disa
14bc0 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29 3b  bleColCache>0 );
14bd0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
14be0 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d 2d  isableColCache--
14bf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14c00 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
14c10 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
14c20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
14c30 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  SE: {.      if( 
14c40 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
14c50 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
14c60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14c70 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
14c90 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
14ca0 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
14cb0 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
14cc0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
14cd0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
14ce0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
14cf0 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65  olumn!=OE_Ignore
14d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73   ){.         ass
14d10 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
14d20 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  umn==OE_Rollback
14d30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
14d40 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
14d50 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20  umn == OE_Abort 
14d60 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
14d70 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
14d80 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b  mn == OE_Fail );
14d90 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
14da0 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 50 61  3DequoteExpr(pPa
14db0 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b  rse->db, pExpr);
14dc0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
14dd0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14de0 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
14df0 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72  ONSTRAINT, pExpr
14e00 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 0a 20 20  ->iColumn, 0,.  
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
14e30 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
14e40 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
14e50 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
14e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
14e70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
14e80 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20  OE_Ignore );.   
14e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14ea0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
14eb0 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b  ntextPop, 0, 0);
14ec0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
14ed0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14ee0 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
14ef0 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
14f00 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20  noreJump);.     
14f10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14f20 28 76 2c 20 22 72 61 69 73 65 28 49 47 4e 4f 52  (v, "raise(IGNOR
14f30 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  E)"));.      }. 
14f40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14f50 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
14f60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
14f70 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
14f80 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
14f90 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
14fa0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
14fb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65  );.  return inRe
14fc0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  g;.}../*.** Gene
14fd0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
14fe0 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
14ff0 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
15000 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
15010 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
15020 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
15030 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
15040 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
15050 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
15060 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
15070 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
15080 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
15090 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
150a0 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
150b0 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
150c0 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
150d0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
150e0 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
150f0 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
15100 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f  pReg to zero..*/
15110 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
15120 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a  CodeTemp(Parse *
15130 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15140 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b  xpr, int *pReg){
15150 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
15160 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15170 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 32 20  arse);.  int r2 
15180 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15190 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
151a0 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 69 66  pExpr, r1);.  if
151b0 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
151c0 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 7d 65  *pReg = r1;.  }e
151d0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
151e0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
151f0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
15200 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  *pReg = 0;.  }. 
15210 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f   return r2;.}../
15220 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
15230 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
15240 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
15250 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
15260 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
15270 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
15280 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
15290 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
152a0 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
152b0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
152c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
152d0 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
152e0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
152f0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
15300 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
15310 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
15320 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
15330 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
15340 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
15350 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
15360 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
15370 65 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  et);.  assert( p
15380 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20  Parse->pVdbe || 
15390 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
153a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
153b0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
153c0 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
153d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
153e0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
153f0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
15400 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74  y, inReg, target
15410 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15420 74 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  target;.}../*.**
15430 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15440 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65  hat evalutes the
15450 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
15460 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65 20 72  n and puts the r
15470 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65 67 69  esult.** in regi
15480 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  ster target..**.
15490 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61 20 63  ** Also make a c
154a0 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
154b0 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e  ssion results in
154c0 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61 63 68  to another "cach
154d0 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 61  e" register.** a
154e0 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 65 78  nd modify the ex
154f0 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68 61 74  pression so that
15500 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
15510 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 2c 0a  t is evaluated,.
15520 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ** the result is
15530 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
15540 61 63 68 65 20 72 65 67 69 73 74 65 72 2e 0a 2a  ache register..*
15550 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15560 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 78  e is used for ex
15570 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
15580 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70 6c 65  re used multiple
15590 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54 68 65   .** times.  The
155a0 79 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  y are evaluated 
155b0 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73  once and the res
155c0 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78 70 72  ults of the expr
155d0 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20 72 65  ession.** are re
155e0 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
155f0 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
15600 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
15610 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
15620 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
15630 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15640 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
15650 6e 52 65 67 3b 0a 20 20 69 6e 52 65 67 20 3d 20  nReg;.  inReg = 
15660 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
15670 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
15680 61 72 67 65 74 29 3b 0a 20 20 61 73 73 65 72 74  arget);.  assert
15690 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
156a0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
156b0 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 20 20 0a  K_REGISTER ){  .
156c0 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20      int iMem;.  
156d0 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
156e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
156f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15700 2c 20 4f 50 5f 43 6f 70 79 2c 20 69 6e 52 65 67  , OP_Copy, inReg
15710 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 70 45 78  , iMem);.    pEx
15720 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 4d 65  pr->iTable = iMe
15730 6d 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  m;.    pExpr->iC
15740 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 6f  olumn = pExpr->o
15750 70 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  p;.    pExpr->op
15760 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
15770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 52    }.  return inR
15780 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  eg;.}../*.** If 
15790 70 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74  pExpr is a const
157a0 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ant expression, 
157b0 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
157c0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
157d0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 20  into a register 
157e0 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20  and convert the 
157f0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20  expression into 
15800 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2a  a TK_REGISTER.**
15810 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
15820 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43  static int evalC
15830 6f 6e 73 74 45 78 70 72 28 76 6f 69 64 20 2a 70  onstExpr(void *p
15840 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
15850 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
15860 73 65 20 3d 20 28 50 61 72 73 65 2a 29 70 41 72  se = (Parse*)pAr
15870 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  g;.  if( pExpr->
15880 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
15890 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
158a0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
158b0 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
158c0 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 20 29  NotJoin(pExpr) )
158d0 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 2b  {.    int r1 = +
158e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
158f0 20 20 20 69 6e 74 20 72 32 3b 0a 20 20 20 20 72     int r2;.    r
15900 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
15910 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
15920 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
15930 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 20 73    if( r1!=r2 ) s
15940 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15950 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
15960 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  ;.    pExpr->iCo
15970 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 6f 70  lumn = pExpr->op
15980 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
15990 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
159a0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
159b0 20 3d 20 72 32 3b 0a 20 20 20 20 72 65 74 75 72   = r2;.    retur
159c0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
159d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 0;.}../*.** Pr
159e0 65 65 76 61 6c 75 61 74 65 20 63 6f 6e 73 74 61  eevaluate consta
159f0 6e 74 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  nt subexpression
15a00 73 20 77 69 74 68 69 6e 20 70 45 78 70 72 20 61  s within pExpr a
15a10 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
15a20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
15a30 74 65 72 73 2e 20 20 4d 6f 64 69 66 79 20 70 45  ters.  Modify pE
15a40 78 70 72 20 73 6f 20 74 68 61 74 20 74 68 65 20  xpr so that the 
15a50 63 6f 6e 73 74 61 6e 74 20 73 75 62 65 78 70 72  constant subexpr
15a60 65 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 54 4b  esions.** are TK
15a70 5f 52 45 47 49 53 54 45 52 20 6f 70 63 6f 64 65  _REGISTER opcode
15a80 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
15a90 74 68 65 20 70 72 65 63 6f 6d 70 75 74 65 64 20  the precomputed 
15aa0 76 61 6c 75 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  values..*/.void 
15ab0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
15ac0 6f 6e 73 74 61 6e 74 73 28 50 61 72 73 65 20 2a  onstants(Parse *
15ad0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
15ae0 78 70 72 29 7b 0a 20 20 20 77 61 6c 6b 45 78 70  xpr){.   walkExp
15af0 72 54 72 65 65 28 70 45 78 70 72 2c 20 65 76 61  rTree(pExpr, eva
15b00 6c 43 6f 6e 73 74 45 78 70 72 2c 20 70 50 61 72  lConstExpr, pPar
15b10 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  se);.}.../*.** G
15b20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
15b30 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
15b40 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
15b50 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
15b60 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
15b70 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
15b80 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
15b90 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
15ba0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
15bb0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
15bc0 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
15bd0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
15be0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
15bf0 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
15c00 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
15c10 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15c20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
15c30 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72  t,   /* The expr
15c40 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62  ession list to b
15c50 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e coded */.  int
15c60 20 74 61 72 67 65 74 20 20 20 20 20 20 20 20 20   target         
15c70 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
15c80 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  e results */.){.
15c90 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
15ca0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
15cb0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73   int i, n;.  ass
15cc0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c  ert( pList!=0 ||
15cd0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
15ce0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
15cf0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
15d00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
15d10 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
15d20 74 3e 30 20 29 3b 0a 20 20 6e 20 3d 20 70 4c 69  t>0 );.  n = pLi
15d30 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
15d40 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
15d50 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20   i=n; i>0; i--, 
15d60 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
15d70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
15d80 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
15d90 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
15da0 20 74 61 72 67 65 74 2b 2b 3b 0a 20 20 7d 0a 20   target++;.  }. 
15db0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
15dc0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
15dd0 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
15de0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
15df0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
15e00 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
15e10 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
15e20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
15e30 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
15e40 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
15e50 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
15e60 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15e70 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
15e80 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
15e90 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
15ea0 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
15eb0 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
15ec0 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
15ed0 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
15ee0 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51  fNull flag is SQ
15ef0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e  LITE_JUMPIFNULL.
15f00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
15f10 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
15f20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
15f30 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
15f40 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
15f50 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
15f60 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
15f70 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
15f80 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
15f90 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
15fa0 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
15fb0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
15fc0 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
15fd0 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
15fe0 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
15ff0 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
16000 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
16010 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
16020 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
16030 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
16040 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
16050 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
16060 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
16070 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
16080 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
16090 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
160a0 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
160b0 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
160c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
160d0 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
160e0 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
160f0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
16100 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
16110 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
16120 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
16130 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
16140 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
16150 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
16160 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
16170 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
16180 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
16190 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
161a0 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
161b0 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
161c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
161d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
161e0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
161f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
16200 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
16210 6c 43 61 63 68 65 3d 3d 30 20 29 3b 0a 20 20 20  lCache==0 );.   
16220 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
16230 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
16240 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a  xpr->pLeft, d2,j
16250 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45  umpIfNull^SQLITE
16260 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
16270 20 20 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61      pParse->disa
16280 62 6c 65 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a 20  bleColCache++;. 
16290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
162a0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
162b0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
162c0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
162d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
162e0 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f  Parse->disableCo
162f0 6c 43 61 63 68 65 3e 30 20 29 3b 0a 20 20 20 20  lCache>0 );.    
16300 20 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c    pParse->disabl
16310 65 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 20  eColCache--;.   
16320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16330 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
16340 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16350 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16360 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
16370 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
16380 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  ll==0 );.      t
16390 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
163a0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
163b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
163c0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
163d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
163e0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
163f0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50  fNull);.      pP
16400 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c  arse->disableCol
16410 43 61 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73  Cache++;.      s
16420 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
16430 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16440 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
16450 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
16460 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
16470 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
16480 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  >0 );.      pPar
16490 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
164a0 63 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65  che--;.      bre
164b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
164c0 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
164d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
164e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
164f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
16500 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
16510 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
16520 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
16530 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16540 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
16550 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
16560 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
16570 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
16580 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
16590 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
165a0 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
165b0 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
165c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
165d0 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
165e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
165f0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
16600 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16610 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
16620 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
16630 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
16640 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
16650 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 74  OP_Ne );.      t
16660 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16670 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
16680 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20  case( op==TK_LE 
16690 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
166a0 65 28 20 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  e( op==TK_GT );.
166b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
166c0 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20  op==TK_GE );.   
166d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
166e0 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
166f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
16700 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _NE );.      tes
16710 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
16720 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  l==0 );.      co
16730 64 65 43 6f 6d 70 61 72 65 4f 70 65 72 61 6e 64  deCompareOperand
16740 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
16750 3e 70 4c 65 66 74 2c 20 26 72 31 2c 20 26 72 65  >pLeft, &r1, &re
16760 67 46 72 65 65 31 2c 0a 20 20 20 20 20 20 20 20  gFree1,.        
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16790 3e 70 52 69 67 68 74 2c 20 26 72 32 2c 20 26 72  >pRight, &r2, &r
167a0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
167b0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
167c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
167d0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
167e0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
167f0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
16800 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
16810 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16820 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
16830 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16840 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
16850 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16860 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
16870 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
16880 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
16890 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
168a0 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
168b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
168c0 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
168d0 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
168e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
168f0 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
16900 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16910 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20  =TK_NOTNULL );. 
16920 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
16930 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16940 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16950 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
16960 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16970 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
16980 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
16990 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
169a0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
169b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
169c0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
169d0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78   {.      /*    x
169e0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
169f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16a00 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74  ** Is equivalent
16a10 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20   to .      **.  
16a20 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41      **    x>=y A
16a30 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a  ND x<=z.      **
16a40 0a 20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69  .      ** Code i
16a50 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
16a60 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
16a70 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
16a80 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65  ssion.      ** e
16a90 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
16aa0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16ab0 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20   Expr exprAnd;. 
16ac0 20 20 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65       Expr compLe
16ad0 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63  ft;.      Expr c
16ae0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ompRight;.      
16af0 45 78 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20  Expr exprX;..   
16b00 20 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70     exprX = *pExp
16b10 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
16b20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
16b30 41 4e 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41  AND;.      exprA
16b40 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70  nd.pLeft = &comp
16b50 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72  Left;.      expr
16b60 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
16b70 6d 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63  mpRight;.      c
16b80 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
16b90 47 45 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65  GE;.      compLe
16ba0 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
16bb0 58 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66  X;.      compLef
16bc0 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
16bd0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
16be0 78 70 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52  xpr;.      compR
16bf0 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
16c00 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
16c10 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
16c20 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74  .      compRight
16c30 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
16c40 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
16c50 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e  pr;.      exprX.
16c60 69 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  iTable = sqlite3
16c70 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16c80 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
16c90 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
16ca0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16cb0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78  1==0 );.      ex
16cc0 70 72 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  prX.op = TK_REGI
16cd0 53 54 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74  STER;.      test
16ce0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
16cf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
16d00 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
16d10 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
16d20 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
16d30 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
16d40 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
16d50 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  lt: {.      r1 =
16d60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16d70 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16d80 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
16d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16da0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
16db0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
16dc0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
16dd0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16de0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16df0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
16e00 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
16e10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16e20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
16e30 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16e40 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
16e50 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16e60 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
16e70 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a  gFree2);  .}../*
16e80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
16e90 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
16ea0 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
16eb0 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
16ec0 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
16ed0 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
16ee0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
16ef0 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
16f00 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
16f10 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
16f20 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
16f30 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
16f40 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
16f50 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
16f60 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
16f70 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
16f80 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
16f90 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54  pIfNull is SQLIT
16fa0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20  E_JUMPIFNULL or 
16fb0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
16fc0 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73  jumpIfNull.** is
16fd0 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
16fe0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
16ff0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
17000 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
17010 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
17020 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
17030 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
17040 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
17050 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
17060 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
17070 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
17080 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
17090 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
170a0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
170b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
170c0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
170d0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
170e0 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
170f0 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
17100 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
17110 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
17120 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
17130 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
17140 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
17150 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
17160 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
17170 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
17180 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
17190 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
171a0 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
171b0 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
171c0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
171d0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
171e0 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
171f0 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
17200 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
17210 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
17220 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
17230 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
17240 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
17250 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
17260 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
17270 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
17280 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
17290 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
172a0 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
172b0 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
172c0 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
172d0 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
172e0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
172f0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
17300 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
17310 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
17320 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
17330 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
17340 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
17350 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
17360 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
17370 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
17380 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
17390 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
173a0 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
173b0 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
173c0 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
173d0 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
173e0 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
173f0 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
17400 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
17410 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17420 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
17430 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
17440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
17450 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
17460 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
17470 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
17480 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
17490 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
174a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
174b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
174c0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
174d0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
174e0 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
174f0 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
17500 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
17510 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
17520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
17530 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
17540 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
17550 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17560 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
17570 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
17580 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
17590 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
175a0 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
175b0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
175c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
175d0 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69  case( pParse->di
175e0 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30  sableColCache==0
175f0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17600 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
17610 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17620 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
17630 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ull);.      pPar
17640 73 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61  se->disableColCa
17650 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  che++;.      sql
17660 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
17670 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17680 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
17690 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
176a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
176b0 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e  disableColCache>
176c0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  0 );.      pPars
176d0 65 2d 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63  e->disableColCac
176e0 68 65 2d 2d 3b 0a 20 20 20 20 20 20 62 72 65 61  he--;.      brea
176f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17700 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
17710 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
17720 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17730 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17740 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
17750 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
17760 73 65 28 20 70 50 61 72 73 65 2d 3e 64 69 73 61  se( pParse->disa
17770 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29  bleColCache==0 )
17780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
17790 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
177a0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
177b0 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
177c0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
177d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
177e0 3e 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65  >disableColCache
177f0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
17800 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
17810 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
17820 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
17830 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  Null);.      ass
17840 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69 73  ert( pParse->dis
17850 61 62 6c 65 43 6f 6c 43 61 63 68 65 3e 30 20 29  ableColCache>0 )
17860 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
17870 64 69 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 2d  disableColCache-
17880 2d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  -;.      sqlite3
17890 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
178a0 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
178b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
178c0 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
178d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
178e0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
178f0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
17900 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
17910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17920 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
17930 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
17940 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
17950 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
17960 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
17970 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
17980 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  Q: {.      testc
17990 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 29  ase( op==TK_LT )
179a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
179b0 28 20 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ( op==TK_LE );. 
179c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
179d0 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
179e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
179f0 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 74  TK_GE );.      t
17a00 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17a10 45 51 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  EQ );.      test
17a20 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 45 20  case( op==TK_NE 
17a30 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17a40 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
17a50 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
17a60 6d 70 61 72 65 4f 70 65 72 61 6e 64 73 28 70 50  mpareOperands(pP
17a70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17a80 66 74 2c 20 26 72 31 2c 20 26 72 65 67 46 72 65  ft, &r1, &regFre
17a90 65 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e1,.            
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
17ac0 67 68 74 2c 20 26 72 32 2c 20 26 72 65 67 46 72  ght, &r2, &regFr
17ad0 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
17ae0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
17af0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
17b00 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
17b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c     r1, r2, dest,
17b30 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
17b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17b50 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
17b60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17b70 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
17b80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17b90 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
17ba0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
17bb0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
17bc0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17bd0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
17be0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17bf0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
17c00 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
17c10 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17c20 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17c30 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17c50 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
17c60 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
17c70 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
17c80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
17c90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17ca0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
17cb0 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 78 20 42  .      /*    x B
17cc0 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
17cd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17ce0 20 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   Is equivalent t
17cf0 6f 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o .      **.    
17d00 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
17d10 20 78 3c 3d 7a 0a 20 20 20 20 20 20 2a 2a 0a 20   x<=z.      **. 
17d20 20 20 20 20 20 2a 2a 20 43 6f 64 65 20 69 74 20       ** Code it 
17d30 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
17d40 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
17d50 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
17d60 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  ion.      ** ele
17d70 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  mentation of x..
17d80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
17d90 78 70 72 20 65 78 70 72 41 6e 64 3b 0a 20 20 20  xpr exprAnd;.   
17da0 20 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74     Expr compLeft
17db0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 63 6f 6d  ;.      Expr com
17dc0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 45 78  pRight;.      Ex
17dd0 70 72 20 65 78 70 72 58 3b 0a 0a 20 20 20 20 20  pr exprX;..     
17de0 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d   exprX = *pExpr-
17df0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 65 78  >pLeft;.      ex
17e00 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e  prAnd.op = TK_AN
17e10 44 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 64  D;.      exprAnd
17e20 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65  .pLeft = &compLe
17e30 66 74 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e  ft;.      exprAn
17e40 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
17e50 52 69 67 68 74 3b 0a 20 20 20 20 20 20 63 6f 6d  Right;.      com
17e60 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45  pLeft.op = TK_GE
17e70 3b 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74  ;.      compLeft
17e80 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b  .pLeft = &exprX;
17e90 0a 20 20 20 20 20 20 63 6f 6d 70 4c 65 66 74 2e  .      compLeft.
17ea0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
17eb0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
17ec0 72 3b 0a 20 20 20 20 20 20 63 6f 6d 70 52 69 67  r;.      compRig
17ed0 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20  ht.op = TK_LE;. 
17ee0 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
17ef0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
17f00 20 20 20 20 20 63 6f 6d 70 52 69 67 68 74 2e 70       compRight.p
17f10 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
17f20 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
17f30 3b 0a 20 20 20 20 20 20 65 78 70 72 58 2e 69 54  ;.      exprX.iT
17f40 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 45 78  able = sqlite3Ex
17f50 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17f60 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
17f70 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
17f80 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
17f90 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
17fa0 58 2e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54  X.op = TK_REGIST
17fb0 45 52 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ER;.      testca
17fc0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
17fd0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
17fe0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
17ff0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
18000 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
18010 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18020 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
18030 74 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  t: {.      r1 = 
18040 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
18050 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
18060 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  r, &regFree1);. 
18070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18080 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
18090 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
180a0 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
180b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
180c0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
180d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
180e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
180f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18100 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
18110 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18120 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
18130 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18140 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
18150 72 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a  regFree2);.}../*
18160 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
18170 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
18180 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
18190 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
181a0 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
181b0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
181c0 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
181d0 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
181e0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
181f0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
18200 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
18210 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 65 76   return FALSE ev
18220 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
18230 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
18240 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
18250 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
18260 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
18270 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
18280 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
18290 65 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 6a  e return FALSE j
182a0 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20  ust to be safe. 
182b0 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
182c0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 66  ine.** returns f
182d0 61 6c 73 65 2c 20 74 68 65 6e 20 79 6f 75 20 64  alse, then you d
182e0 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f  o not really kno
182f0 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66  w for certain if
18300 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72   the two.** expr
18310 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
18320 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f  same.  But if yo
18330 75 20 67 65 74 20 61 20 54 52 55 45 20 72 65 74  u get a TRUE ret
18340 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a 2a  urn, then you.**
18350 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 65   can be sure the
18360 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
18370 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20 74   the same.  In t
18380 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65 0a  he places where.
18390 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
183a0 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65 73  is used, it does
183b0 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65 74   not hurt to get
183c0 20 61 6e 20 65 78 74 72 61 20 46 41 4c 53 45 20   an extra FALSE 
183d0 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
183e0 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
183f0 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
18400 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
18410 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
18420 6e 63 6f 72 72 65 63 74 20 54 52 55 45 20 63 6f  ncorrect TRUE co
18430 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61  uld lead to a ma
18440 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  lfunction..*/.in
18450 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  t sqlite3ExprCom
18460 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45  pare(Expr *pA, E
18470 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20  xpr *pB){.  int 
18480 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 7c 7c  i;.  if( pA==0||
18490 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
184a0 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20 7d 0a  urn pB==pA;.  }.
184b0 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
184c0 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ->op ) return 0;
184d0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
184e0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
184f0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
18500 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
18510 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
18520 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
18530 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
18540 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
18550 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
18560 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
18570 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
18580 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
18590 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73  ;.  if( pA->pLis
185a0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  t ){.    if( pB-
185b0 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  >pList==0 ) retu
185c0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 0;.    if( pA
185d0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
185e0 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pB->pList->nExpr
185f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
18600 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
18610 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
18620 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  +){.      if( !s
18630 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
18640 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  e(pA->pList->a[i
18650 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69  ].pExpr, pB->pLi
18660 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
18670 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
18680 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
18690 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
186a0 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  B->pList ){.    
186b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
186c0 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20  if( pA->pSelect 
186d0 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29  || pB->pSelect )
186e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
186f0 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
18700 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
18710 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
18720 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
18730 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b    if( pA->op!=TK
18740 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e 74  _COLUMN && pA->t
18750 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
18760 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
18770 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
18780 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
18790 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
187a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
187b0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
187c0 70 28 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b  p((char*)pA->tok
187d0 65 6e 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e  en.z,(char*)pB->
187e0 74 6f 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65  token.z,pB->toke
187f0 6e 2e 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  n.n)!=0 ){.     
18800 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18810 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
18820 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
18830 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
18840 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
18850 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
18860 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
18870 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
18880 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
18890 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
188a0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
188b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
188c0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
188d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
188e0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
188f0 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
18900 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
18910 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
18920 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
18930 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
18940 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
18950 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
18960 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66   3,.       &pInf
18970 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  o->nColumn,.    
18980 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
18990 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20  mnAlloc,.       
189a0 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  &i.  );.  return
189b0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
189c0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
189d0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
189e0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61  fo->aFunc[] arra
189f0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
18a00 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
18a10 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
18a20 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
18a30 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
18a40 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
18a50 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46   int addAggInfoF
18a60 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  unc(sqlite3 *db,
18a70 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29   AggInfo *pInfo)
18a80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e  {.  int i;.  pIn
18a90 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69  fo->aFunc = sqli
18aa0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
18ab0 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20  (.       db, .  
18ac0 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e       pInfo->aFun
18ad0 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  c,.       sizeof
18ae0 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  (pInfo->aFunc[0]
18af0 29 2c 0a 20 20 20 20 20 20 20 33 2c 0a 20 20 20  ),.       3,.   
18b00 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
18b10 63 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  c,.       &pInfo
18b20 2d 3e 6e 46 75 6e 63 41 6c 6c 6f 63 2c 0a 20 20  ->nFuncAlloc,.  
18b30 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72       &i.  );.  r
18b40 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a  eturn i;.}    ..
18b50 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  /*.** This is an
18b60 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
18b70 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20 74  xprTree() used t
18b80 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20  o implement .** 
18b90 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
18ba0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20  zeAggregates(). 
18bb0 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
18bc0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
18bd0 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f  s.** for additio
18be0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
18bf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18c00 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65  ine analyzes the
18c10 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18c20 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f  ion at pExpr..*/
18c30 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
18c40 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f 69  yzeAggregate(voi
18c50 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
18c60 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Expr){.  int i;.
18c70 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
18c80 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
18c90 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73  t *)pArg;.  Pars
18ca0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
18cb0 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69  >pParse;.  SrcLi
18cc0 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
18cd0 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
18ce0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
18cf0 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66  o = pNC->pAggInf
18d00 6f 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  o;..  switch( pE
18d10 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
18d20 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
18d30 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
18d40 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
18d50 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
18d60 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
18d70 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
18d80 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
18d90 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
18da0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
18db0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
18dc0 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b   if( pSrcList ){
18dd0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
18de0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
18df0 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
18e00 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  a;.        for(i
18e10 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
18e20 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
18e30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
18e40 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
18e50 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20  l *pCol;.       
18e60 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
18e70 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
18e80 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rsor ){.        
18e90 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
18ea0 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
18eb0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78  t means that pEx
18ec0 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  pr refers to a t
18ed0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
18ee0 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74   ** that is in t
18ef0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
18f00 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
18f10 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20  query.  .       
18f20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
18f30 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65      ** Make an e
18f40 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  ntry for the col
18f50 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  umn in pAggInfo-
18f60 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65  >aCol[] if there
18f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
18f80 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20  is not an entry 
18f90 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
18fa0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
18fb0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
18fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
18fd0 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  l = pAggInfo->aC
18fe0 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
18ff0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49  for(k=0; k<pAggI
19000 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  nfo->nColumn; k+
19010 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
19020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
19030 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  ol->iTable==pExp
19040 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19060 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  Col->iColumn==pE
19070 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19090 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
190a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
190b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
190c0 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66   if( (k>=pAggInf
190d0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20  o->nColumn).    
190e0 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d           && (k =
190f0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
19100 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  n(pParse->db, pA
19110 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20  ggInfo))>=0 .   
19120 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
19130 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
19140 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
19150 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
19160 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
19170 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
19180 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
19190 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
191a0 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
191b0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
191c0 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
191d0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
191e0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
191f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19210 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
19220 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
19230 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
19240 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
19250 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
19260 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
19270 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
19280 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
192a0 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
192b0 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
192c0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
192d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
192e0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
192f0 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
19300 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
19310 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
19320 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
19330 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
19340 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
19350 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
19360 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
19370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19380 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
19390 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
193a0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
193b0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
193d0 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
193e0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
19410 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
19430 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
19440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19450 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19470 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
19480 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
19490 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
194a0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
194b0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
194c0 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
194d0 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
194e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
194f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19500 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
19510 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
19520 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
19530 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
19540 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
19550 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
19560 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
19570 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
19580 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
19590 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
195a0 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
195b0 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
195c0 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
195d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
195e0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
195f0 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
19600 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
19610 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
19620 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
19630 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
19640 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
19650 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
19660 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
19670 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  gg = k;.        
19680 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19690 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
196a0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
196b0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
196c0 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
196d0 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
196e0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
196f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19700 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
19710 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
19720 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  {.      /* The p
19730 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65  NC->nDepth==0 te
19740 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67  st causes aggreg
19750 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
19760 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20   subqueries.    
19770 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72    ** to be ignor
19780 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
19790 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29  pNC->nDepth==0 )
197a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
197b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
197c0 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
197d0 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
197e0 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
197f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
19800 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
19810 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
19820 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
19830 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
19840 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
19850 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
19860 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
19870 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
19880 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
19890 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
198a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
198b0 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
198c0 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20  ->pExpr, pExpr) 
198d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
198e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
198f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19900 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
19910 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
19920 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
19930 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
19940 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
19950 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
19960 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
19970 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
19980 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
19990 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
199a0 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
199b0 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nc(pParse->db, p
199c0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
199d0 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
199e0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
199f0 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
19a00 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
19a10 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
19a20 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
19a30 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
19a40 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
19a50 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
19a60 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
19a70 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
19a80 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d     (char*)pExpr-
19ab0 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
19ac0 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20  >token.n,.      
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
19ae0 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70  pr->pList ? pExp
19af0 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
19b00 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
19b10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
19b20 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
19b30 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
19b40 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
19b50 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
19b60 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
19b70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
19b90 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
19ba0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
19bb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
19bc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19bd0 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
19be0 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
19bf0 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
19c00 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
19c10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
19c20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
19c30 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   i;.        pExp
19c40 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
19c50 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
19c60 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
19c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
19c80 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77 61  * Recursively wa
19c90 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f  lk subqueries lo
19ca0 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c  oking for TK_COL
19cb0 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e  UMN nodes that n
19cc0 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63  eed.  ** to be c
19cd0 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47  hanged to TK_AGG
19ce0 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e  _COLUMN.  But in
19cf0 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73  crement nDepth s
19d00 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41  o that.  ** TK_A
19d10 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
19d20 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 20  s in subqueries 
19d30 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65  will be unchange
19d40 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  d..  */.  if( pE
19d50 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
19d60 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
19d70 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63  +;.    walkSelec
19d80 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65  tExpr(pExpr->pSe
19d90 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67  lect, analyzeAgg
19da0 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
19db0 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b    pNC->nDepth--;
19dc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
19dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
19de0 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
19df0 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
19e00 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
19e10 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
19e20 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
19e30 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
19e40 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
19e50 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
19e60 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
19e70 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
19e80 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
19e90 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
19ea0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
19eb0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
19ec0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
19ed0 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
19ee0 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
19ef0 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
19f00 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
19f10 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
19f20 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
19f30 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f  ggregates(NameCo
19f40 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
19f50 20 2a 70 45 78 70 72 29 7b 0a 20 20 77 61 6c 6b   *pExpr){.  walk
19f60 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
19f70 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
19f80 2c 20 70 4e 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pNC);.}../*.**
19f90 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   Call sqlite3Exp
19fa0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
19fb0 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65  es() for every e
19fc0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a  xpression in an.
19fd0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
19fe0 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  st.  Return the 
19ff0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1a000 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1a010 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ror is found, th
1a020 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75  e analysis is cu
1a030 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64  t short..*/.void
1a040 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
1a050 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
1a060 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
1a070 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
1a080 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a090 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a0a0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1a0b0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
1a0c0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1a0d0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1a0e0 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
1a0f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1a100 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
1a110 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
1a120 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
1a130 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
1a140 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
1a150 74 65 20 74 65 6d 70 6f 72 61 72 79 20 75 73 65  te temporary use
1a160 20 72 65 67 69 73 74 65 72 73 20 64 75 72 69 6e   registers durin
1a170 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
1a180 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1a190 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73  3GetTempReg(Pars
1a1a0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
1a1b0 74 20 69 2c 20 72 3b 0a 20 20 69 66 28 20 70 50  t i, r;.  if( pP
1a1c0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
1a1d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a1e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a1f0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1a200 3c 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  <pParse->nTempRe
1a210 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 20 3d  g; i++){.    r =
1a220 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
1a230 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 75 73  g[i];.    if( us
1a240 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
1a250 70 50 61 72 73 65 2c 20 72 2c 20 72 29 20 29 20  pParse, r, r) ) 
1a260 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 20 20  continue;.  }.  
1a270 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
1a280 54 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 72  TempReg ){.    r
1a290 65 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e  eturn ++pParse->
1a2a0 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  nMem;.  }.  whil
1a2b0 65 28 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 65  e( i<pParse->nTe
1a2c0 6d 70 52 65 67 2d 31 20 29 7b 0a 20 20 20 20 70  mpReg-1 ){.    p
1a2d0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
1a2e0 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 61 54 65  i] = pParse->aTe
1a2f0 6d 70 52 65 67 5b 69 2b 31 5d 3b 0a 20 20 7d 0a  mpReg[i+1];.  }.
1a300 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
1a310 65 67 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 72  eg--;.  return r
1a320 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
1a330 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
1a340 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1a350 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
1a360 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
1a370 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
1a380 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
1a390 65 67 29 20 29 7b 0a 20 20 20 20 70 50 61 72 73  eg) ){.    pPars
1a3a0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
1a3b0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
1a3c0 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
1a3d0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72  *.** Allocate or
1a3e0 20 64 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c   deallocate a bl
1a3f0 6f 63 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73  ock of nReg cons
1a400 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
1a410 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  s.*/.int sqlite3
1a420 47 65 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72  GetTempRange(Par
1a430 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1a440 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nReg){.  int i, 
1a450 6e 3b 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d  n;.  i = pParse-
1a460 3e 69 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20  >iRangeReg;.  n 
1a470 3d 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  = pParse->nRange
1a480 52 65 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c  Reg;.  if( nReg<
1a490 3d 6e 20 26 26 20 21 75 73 65 64 41 73 43 6f 6c  =n && !usedAsCol
1a4a0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
1a4b0 20 69 2c 20 69 2b 6e 2d 31 29 20 29 7b 0a 20 20   i, i+n-1) ){.  
1a4c0 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
1a4d0 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 20  Reg += nReg;.   
1a4e0 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
1a4f0 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d 65  eg -= nReg;.  }e
1a500 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50 61  lse{.    i = pPa
1a510 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1a520 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1a530 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65 74   nReg;.  }.  ret
1a540 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73 71  urn i;.}.void sq
1a550 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a560 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
1a570 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
1a580 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 66 28 20  nt nReg){.  if( 
1a590 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
1a5a0 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
1a5b0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
1a5c0 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
1a5d0 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
1a5e0 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a              iReg;.  }.}.