/ Hex Artifact Content
Login

Artifact a1ca13387073839c8be909d734927344b23d0387:


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 32 33 35 20 32 30 30 35 2f 31 31 2f 30 33 20  .235 2005/11/03 
0220: 31 32 3a 33 33 3a 32 38 20 64 72 68 20 45 78 70  12:33:28 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 41 53 20 29 7b 0a 20  ( op==TK_AS ){. 
04d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
04e0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
04f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d  xpr->pLeft);.  }
0500: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0510: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
0520: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
0530: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53  finity(pExpr->pS
0540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
0550: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [0].pExpr);.  }.
0560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0570: 4d 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f  MIT_CAST.  if( o
0580: 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20  p==TK_CAST ){.  
0590: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
05a0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
05b0: 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 30 29 3b 0a  xpr->token, 0);.
05c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
05d0: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
05e0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ity;.}../*.** Re
05f0: 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
0600: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
0610: 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72  nce for the expr
0620: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66  ession pExpr. If
0630: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20  .** there is no 
0640: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
0650: 6e 20 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30  n type, return 0
0660: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
0670: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
0680: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0690: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
06a0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
06b0: 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   0;.  if( pExpr 
06c0: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70  ){.    pColl = p
06d0: 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
06e0: 20 69 66 28 20 28 70 45 78 70 72 2d 3e 6f 70 3d   if( (pExpr->op=
06f0: 3d 54 4b 5f 41 53 20 7c 7c 20 70 45 78 70 72 2d  =TK_AS || pExpr-
0700: 3e 6f 70 3d 3d 54 4b 5f 43 41 53 54 29 20 26 26  >op==TK_CAST) &&
0710: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
0720: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
0730: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
0740: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
0750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
0760: 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  ( sqlite3CheckCo
0770: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43  llSeq(pParse, pC
0780: 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f  oll) ){ .    pCo
0790: 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ll = 0;.  }.  re
07a0: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
07b0: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e  *.** pExpr is an
07c0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f   operand of a co
07d0: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
07e0: 72 2e 20 20 61 66 66 32 20 69 73 20 74 68 65 0a  r.  aff2 is the.
07f0: 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  ** type affinity
0800: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70   of the other op
0810: 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75  erand.  This rou
0820: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
0830: 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74  .** type affinit
0840: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  y that should be
0850: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f   used for the co
0860: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
0870: 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  r..*/.char sqlit
0880: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0890: 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  y(Expr *pExpr, c
08a0: 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61  har aff2){.  cha
08b0: 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33  r aff1 = sqlite3
08c0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
08d0: 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20  pr);.  if( aff1 
08e0: 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  && aff2 ){.    /
08f0: 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20  * Both sides of 
0900: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61  the comparison a
0910: 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f  re columns. If o
0920: 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20  ne has numeric. 
0930: 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20     ** affinity, 
0940: 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77  use that. Otherw
0950: 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e  ise use no affin
0960: 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ity..    */.    
0970: 69 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45  if( aff1==SQLITE
0980: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
0990: 61 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46  aff2==SQLITE_AFF
09a0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
09b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
09c0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
09d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
09e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
09f0: 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  NONE;.    }.  }e
0a00: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
0a10: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
0a20: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
0a30: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
0a40: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  is a column.  Co
0a50: 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  mpare the.    **
0a60: 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c   results directl
0a70: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  y..    */.    re
0a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
0a90: 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NONE;.  }else{. 
0aa0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
0ab0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
0ac0: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
0ad0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
0ae0: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61  finity. */.    a
0af0: 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20 7c  ssert( aff1==0 |
0b00: 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20  | aff2==0 );.   
0b10: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
0b20: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
0b30: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
0b40: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
0b50: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
0b60: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
0b70: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
0b80: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
0b90: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
0ba0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
0bb0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
0bc0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
0bd0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
0be0: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
0bf0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
0c00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
0c10: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0c20: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
0c30: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
0c40: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0c50: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
0c60: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
0c70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
0c80: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
0c90: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20  >op==TK_NE );.  
0ca0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
0cb0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
0cc0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0cd0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
0ce0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
0cf0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
0d00: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
0d10: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
0d20: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
0d30: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70    }.  else if( p
0d40: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
0d50: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0d60: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0d70: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0d80: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0d90: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Expr, aff);.  }.
0da0: 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66 20    else if( !aff 
0db0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
0dc0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
0dd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
0de0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
0df0: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
0e00: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
0e10: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
0e20: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
0e30: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
0e40: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
0e50: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
0e60: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
0e70: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
0e80: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
0e90: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
0ea0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
0eb0: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
0ec0: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
0ed0: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
0ee0: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
0ef0: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
0f00: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
0f10: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
0f20: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
0f30: 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 66 66 3d  ;.  return (aff=
0f40: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
0f50: 29 20 7c 7c 20 28 61 66 66 3d 3d 69 64 78 5f 61  ) || (aff==idx_a
0f60: 66 66 69 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a  ffinity);.}../*.
0f70: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 31  ** Return the P1
0f80: 20 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75   value that shou
0f90: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ld be used for a
0fa0: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73   binary comparis
0fb0: 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50  on.** opcode (OP
0fc0: 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29  _Eq, OP_Ge etc.)
0fd0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
0fe0: 20 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70   pExpr1 and pExp
0ff0: 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66  r2..** If jumpIf
1000: 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c 20 74 68  Null is true, th
1010: 65 6e 20 73 65 74 20 74 68 65 20 6c 6f 77 20 62  en set the low b
1020: 79 74 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  yte of the retur
1030: 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20  ned.** P1 value 
1040: 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f  to tell the opco
1050: 64 65 20 74 6f 20 6a 75 6d 70 20 69 66 20 65 69  de to jump if ei
1060: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a  ther expression.
1070: 2a 2a 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ** evaluates to 
1080: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
1090: 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  int binaryCompar
10a0: 65 50 31 28 45 78 70 72 20 2a 70 45 78 70 72 31  eP1(Expr *pExpr1
10b0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20  , Expr *pExpr2, 
10c0: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
10d0: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 73 71  .  char aff = sq
10e0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
10f0: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 72 65 74  y(pExpr2);.  ret
1100: 75 72 6e 20 28 28 69 6e 74 29 73 71 6c 69 74 65  urn ((int)sqlite
1110: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1120: 28 70 45 78 70 72 31 2c 20 61 66 66 29 29 2b 28  (pExpr1, aff))+(
1130: 6a 75 6d 70 49 66 4e 75 6c 6c 3f 30 78 31 30 30  jumpIfNull?0x100
1140: 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  :0);.}../*.** Re
1150: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1160: 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  o the collation 
1170: 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73 68  sequence that sh
1180: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a  ould be used by.
1190: 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  ** a binary comp
11a0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20  arison operator 
11b0: 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20  comparing pLeft 
11c0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a  and pRight..**.*
11d0: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68 61  * If the left ha
11e0: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  nd expression ha
11f0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
1200: 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65  quence type, the
1210: 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e  n it is.** used.
1220: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
1230: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1240: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
1250: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a  hand expression.
1260: 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74  ** is used, or t
1270: 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41  he default (BINA
1280: 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20 65  RY) if neither e
1290: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20  xpression has a 
12a0: 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70  collating.** typ
12b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
12c0: 6c 53 65 71 2a 20 62 69 6e 61 72 79 43 6f 6d 70  lSeq* binaryComp
12d0: 61 72 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  areCollSeq(Parse
12e0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
12f0: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
1300: 67 68 74 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  ght){.  CollSeq 
1310: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
1320: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1330: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 69 66  se, pLeft);.  if
1340: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
1350: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1360: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1370: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  e, pRight);.  }.
1380: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
1390: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13a0: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
13b0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
13c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13d0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
13e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13f0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1400: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
1410: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
1420: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
1430: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
1440: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
1450: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
1460: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
1470: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
1480: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
1490: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
14a0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  code */.  int de
14b0: 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
14c0: 75 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65  ump here if true
14d0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  .  */.  int jump
14e0: 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20  IfNull    /* If 
14f0: 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69  true, jump if ei
1500: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
1510: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
1520: 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p1 = binaryComp
1530: 61 72 65 50 31 28 70 4c 65 66 74 2c 20 70 52 69  areP1(pLeft, pRi
1540: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
1550: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20  ;.  CollSeq *p3 
1560: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
1570: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1580: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
1590: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
15a0: 64 62 65 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  dbeOp3(pParse->p
15b0: 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20 70 31  Vdbe, opcode, p1
15c0: 2c 20 64 65 73 74 2c 20 28 76 6f 69 64 2a 29 70  , dest, (void*)p
15d0: 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  3, P3_COLLSEQ);.
15e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
15f0: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
1600: 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74  ion node and ret
1610: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1620: 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20   it.  Memory.** 
1630: 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73  for this node is
1640: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1650: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20  qliteMalloc().  
1660: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
1670: 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tion.** is respo
1680: 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
1690: 67 20 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20  g sure the node 
16a0: 65 76 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20  eventually gets 
16b0: 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  freed..*/.Expr *
16c0: 73 71 6c 69 74 65 33 45 78 70 72 28 69 6e 74 20  sqlite3Expr(int 
16d0: 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  op, Expr *pLeft,
16e0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 63   Expr *pRight, c
16f0: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
1700: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
1710: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
1720: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
1730: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
1740: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
1750: 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  * When malloc fa
1760: 69 6c 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66  ils, delete pLef
1770: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78  t and pRight. Ex
1780: 70 72 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64  pressions passed
1790: 20 74 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73   to .    ** this
17a0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61   function must a
17b0: 6c 77 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74  lways be allocat
17c0: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 45  ed with sqlite3E
17d0: 78 70 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a  xpr() for this .
17e0: 20 20 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a      ** reason. .
17f0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1800: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65  e3ExprDelete(pLe
1810: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
1820: 45 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68  ExprDelete(pRigh
1830: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1840: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
1850: 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70   = op;.  pNew->p
1860: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
1870: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70  pNew->pRight = p
1880: 52 69 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69  Right;.  pNew->i
1890: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Agg = -1;.  if( 
18a0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73  pToken ){.    as
18b0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
18c0: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  n==0 );.    pNew
18d0: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
18e0: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
18f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66    }else if( pLef
1900: 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20  t && pRight ){. 
1910: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
1920: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
1930: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
1940: 73 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  span);.  }.  ret
1950: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1960: 2a 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** When doing a 
1970: 6e 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f  nested parse, yo
1980: 75 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65  u can include te
1990: 72 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  rms in an expres
19a0: 73 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f  sion.** that loo
19b0: 6b 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23  k like this:   #
19c0: 30 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65  0 #1 #2 ...  The
19d0: 73 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74  se terms refer t
19e0: 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e  o elements.** on
19f0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30   the stack.  "#0
1a00: 22 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20  " means the top 
1a10: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
1a20: 20 22 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20   "#1" means the 
1a30: 6e 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65  next down on the
1a40: 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20   stack.  And so 
1a50: 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  forth..**.** Thi
1a60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a70: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1a80: 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f  r to deal with o
1a90: 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  n of those terms
1aa0: 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74  ..** It immediat
1ab0: 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ely generates co
1ac0: 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
1ad0: 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72  value in a memor
1ae0: 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54  y location..** T
1af0: 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78  he returns an ex
1b00: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69  pression that wi
1b10: 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  ll code to extra
1b20: 63 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ct the value fro
1b30: 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79  m.** that memory
1b40: 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65   location as nee
1b50: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ded..*/.Expr *sq
1b60: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
1b70: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1b80: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1b90: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1ba0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
1bb0: 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70  pr *p;.  int dep
1bc0: 74 68 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  th;.  if( pParse
1bd0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
1be0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bf0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72  sg(pParse, "near
1c00: 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20   \"%T\": syntax 
1c10: 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b  error", pToken);
1c20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1c30: 20 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20   }.  if( v==0 ) 
1c40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
1c50: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
1c60: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70  EGISTER, 0, 0, p
1c70: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d  Token);.  if( p=
1c80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c90: 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   0;  /* Malloc f
1ca0: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64  ailed */.  }.  d
1cb0: 65 70 74 68 20 3d 20 61 74 6f 69 28 26 70 54 6f  epth = atoi(&pTo
1cc0: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d  ken->z[1]);.  p-
1cd0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
1ce0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69  ->nMem++;.  sqli
1cf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1d00: 4f 50 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30  OP_Dup, depth, 0
1d10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
1d30: 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c  tore, p->iTable,
1d40: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
1d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74  .}../*.** Join t
1d60: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  wo expressions u
1d70: 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72  sing an AND oper
1d80: 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72  ator.  If either
1d90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
1da0: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73  * NULL, then jus
1db0: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68  t return the oth
1dc0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  er expression..*
1dd0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
1de0: 78 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c 65  xprAnd(Expr *pLe
1df0: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
1e00: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
1e10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1e20: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
1e30: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
1e40: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
1e50: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1e60: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
1e70: 70 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74  pr(TK_AND, pLeft
1e80: 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
1e90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
1ea0: 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65  he Expr.span fie
1eb0: 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ld of the given 
1ec0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70  expression to sp
1ed0: 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62  an all.** text b
1ee0: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67  etween the two g
1ef0: 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a  iven tokens..*/.
1f00: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1f10: 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72  Span(Expr *pExpr
1f20: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20  , Token *pLeft, 
1f30: 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a  Token *pRight){.
1f40: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
1f50: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1f60: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69   pLeft!=0 );.  i
1f70: 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  f( !sqlite3_mall
1f80: 6f 63 5f 66 61 69 6c 65 64 20 26 26 20 70 52 69  oc_failed && pRi
1f90: 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d  ght->z && pLeft-
1fa0: 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >z ){.    assert
1fb0: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
1fc0: 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66  || pLeft->z[pLef
1fd0: 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  t->n]==0 );.    
1fe0: 69 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d  if( pLeft->dyn==
1ff0: 30 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e  0 && pRight->dyn
2000: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ==0 ){.      pEx
2010: 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65  pr->span.z = pLe
2020: 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78  ft->z;.      pEx
2030: 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69  pr->span.n = pRi
2040: 67 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74  ght->n + (pRight
2050: 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b  ->z - pLeft->z);
2060: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2070: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20    pExpr->span.z 
2080: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
2090: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
20a0: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
20b0: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
20c0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
20d0: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
20e0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
20f0: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
2100: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
2110: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
2120: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
2130: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
2140: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
2150: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
2160: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2170: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2180: 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69  (pList); /* Avoi
2190: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
21a0: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
21b0: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
21c0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
21d0: 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  op = TK_FUNCTION
21e0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
21f0: 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  = pList;.  if( p
2200: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  Token ){.    ass
2210: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
2220: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ==0 );.    pNew-
2230: 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e  >token = *pToken
2240: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2250: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30  New->token.z = 0
2260: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70  ;.  }.  pNew->sp
2270: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
2280: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
2290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
22a0: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
22b0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
22c0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
22d0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
22e0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
22f0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
2300: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
2310: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
2320: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
2330: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
2340: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
2350: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
2360: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
2370: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
2380: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
2390: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
23a0: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
23b0: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
23c0: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
23d0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
23e0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
23f0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
2400: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
2410: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
2420: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
2430: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
2440: 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22  ":aaa" or "$aaa"
2450: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
2460: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
2470: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
2480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2490: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
24a0: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
24b0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
24c0: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
24d0: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
24e0: 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c  equenial variabl
24f0: 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61  e number is.** a
2500: 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ssigned..*/.void
2510: 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69   sqlite3ExprAssi
2520: 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73  gnVarNumber(Pars
2530: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2540: 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e  *pExpr){.  Token
2550: 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20   *pToken;.  if( 
2560: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
2570: 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20 26 70  n;.  pToken = &p
2580: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61  Expr->token;.  a
2590: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e  ssert( pToken->n
25a0: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
25b0: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b   pToken->z!=0 );
25c0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
25d0: 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  n->z[0]!=0 );.  
25e0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31  if( pToken->n==1
25f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
2600: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
2610: 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65  "?".  Assign the
2620: 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e   next variable n
2630: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70 45 78  umber */.    pEx
2640: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
2650: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d  Parse->nVar;.  }
2660: 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65 6e 2d  else if( pToken-
2670: 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20  >z[0]=='?' ){.  
2680: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
2690: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
26a0: 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22  .  Convert "nnn"
26b0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61   to an integer a
26c0: 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20 69 74  nd.    ** use it
26d0: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
26e0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69   number */.    i
26f0: 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70 72 2d  nt i;.    pExpr-
2700: 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20 61 74  >iTable = i = at
2710: 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  oi(&pToken->z[1]
2720: 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c  );.    if( i<1 |
2730: 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56  | i>SQLITE_MAX_V
2740: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29  ARIABLE_NUMBER )
2750: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2760: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2770: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
2780: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
2790: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
27a0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d          SQLITE_M
27b0: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
27c0: 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
27d0: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
27e0: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  r ){.      pPars
27f0: 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20  e->nVar = i;.   
2800: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2810: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  /* Wildcards of 
2820: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20  the form ":aaa" 
2830: 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65 75 73  or "$aaa".  Reus
2840: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
2850: 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  ble.    ** numbe
2860: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
2870: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
2880: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
2890: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a  f the name.    *
28a0: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
28b0: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
28c0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
28d0: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
28e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  */.    int i, n;
28f0: 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d  .    n = pToken-
2900: 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  >n;.    for(i=0;
2910: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45   i<pParse->nVarE
2920: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
2930: 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
2940: 20 69 66 28 20 28 70 45 20 3d 20 70 50 61 72 73   if( (pE = pPars
2950: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29  e->apVarExpr[i])
2960: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  !=0.          &&
2970: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a   pE->token.n==n.
2980: 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d            && mem
2990: 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c  cmp(pE->token.z,
29a0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d   pToken->z, n)==
29b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
29c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d  pr->iTable = pE-
29d0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
29e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
29f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2a00: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
2a10: 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  r ){.      pExpr
2a20: 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61  ->iTable = ++pPa
2a30: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20  rse->nVar;.     
2a40: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
2a50: 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e  rExpr>=pParse->n
2a60: 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29  VarExprAlloc-1 )
2a70: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  {.        pParse
2a80: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20  ->nVarExprAlloc 
2a90: 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  += pParse->nVarE
2aa0: 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20  xprAlloc + 10;. 
2ab0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2ac0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f 69  allocOrFree((voi
2ad0: 64 2a 2a 29 26 70 50 61 72 73 65 2d 3e 61 70 56  d**)&pParse->apV
2ae0: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b00: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
2b10: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72  lloc*sizeof(pPar
2b20: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d  se->apVarExpr[0]
2b30: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
2b40: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f     if( !sqlite3_
2b50: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
2b60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b70: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
2b80: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
2b90: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
2ba0: 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  pr[pParse->nVarE
2bb0: 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a  xpr++] = pExpr;.
2bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bd0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75  } .}../*.** Recu
2be0: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
2bf0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2c00: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70  e3ExprDelete(Exp
2c20: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
2c30: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
2c40: 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20  ( p->span.dyn ) 
2c50: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
2c60: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  *)p->span.z);.  
2c70: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  if( p->token.dyn
2c80: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
2c90: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
2ca0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
2cb0: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
2cc0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
2cd0: 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b  lete(p->pRight);
2ce0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2cf0: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73  stDelete(p->pLis
2d00: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
2d10: 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65  ectDelete(p->pSe
2d20: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
2d30: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
2d40: 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20   The Expr.token 
2d50: 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61  field might be a
2d60: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
2d70: 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a  that is quoted..
2d80: 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65  ** If so, remove
2d90: 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d   the quotation m
2da0: 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arks..*/.void sq
2db0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
2dc0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
2dd0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
2de0: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
2df0: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
2e00: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
2e10: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
2e20: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
2e30: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
2e40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
2e50: 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74 6f 6b 65  kenCopy(&p->toke
2e60: 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  n, &p->token);. 
2e70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
2e80: 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ote((char*)p->to
2e90: 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ken.z);.}.../*.*
2ea0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2eb0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
2ec0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
2ed0: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
2ee0: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
2ef0: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
2f00: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
2f10: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
2f20: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
2f30: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
2f40: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
2f50: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
2f60: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
2f70: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
2f80: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
2f90: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
2fa0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
2fb0: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
2fc0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
2fd0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2fe0: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
2ff0: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
3000: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
3010: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
3020: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
3030: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
3040: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
3050: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
3060: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
3070: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
3080: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
3090: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
30a0: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
30b0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
30c0: 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b  xprDup(Expr *p){
30d0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
30e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
30f0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3100: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3110: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
3120: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3130: 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79  turn 0;.  memcpy
3140: 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66  (pNew, p, sizeof
3150: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
3160: 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b  p->token.z!=0 ){
3170: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
3180: 2e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  .z = sqliteStrND
3190: 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  up(p->token.z, p
31a0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
31b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  pNew->token.dyn 
31c0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
31d0: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
31e0: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20  token.z==0 );.  
31f0: 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a  }.  pNew->span.z
3200: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
3210: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
3220: 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  rDup(p->pLeft);.
3230: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
3240: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3250: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e  p->pRight);.  pN
3260: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ew->pList = sqli
3270: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
3280: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  ->pList);.  pNew
3290: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
32a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  te3SelectDup(p->
32b0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 4e 65 77  pSelect);.  pNew
32c0: 2d 3e 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62  ->pTab = p->pTab
32d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
32e0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  .}.void sqlite3T
32f0: 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a  okenCopy(Token *
3300: 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f  pTo, Token *pFro
3310: 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64  m){.  if( pTo->d
3320: 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28  yn ) sqliteFree(
3330: 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a  (char*)pTo->z);.
3340: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29    if( pFrom->z )
3350: 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70  {.    pTo->n = p
3360: 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f  From->n;.    pTo
3370: 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ->z = sqliteStrN
3380: 44 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46  Dup(pFrom->z, pF
3390: 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f  rom->n);.    pTo
33a0: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  ->dyn = 1;.  }el
33b0: 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  se{.    pTo->z =
33c0: 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69   0;.  }.}.ExprLi
33d0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
33e0: 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20  istDup(ExprList 
33f0: 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  *p){.  ExprList 
3400: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
3410: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
3420: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
3430: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
3440: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3450: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3460: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
3470: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
3480: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3490: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
34a0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
34b0: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
34c0: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
34d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
34e0: 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d  >nExpr*sizeof(p-
34f0: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
3500: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
3510: 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29  sqliteFree(pNew)
3520: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
3530: 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20    } .  pOldItem 
3540: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
3550: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
3560: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
3570: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
3580: 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70  pr *pNewExpr, *p
3590: 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74  OldExpr;.    pIt
35a0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77  em->pExpr = pNew
35b0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
35c0: 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d  prDup(pOldExpr =
35d0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
35e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
35f0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26  xpr->span.z!=0 &
3600: 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20  & pNewExpr ){.  
3610: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61      /* Always ma
3620: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
3630: 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65   span for top-le
3640: 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  vel expressions 
3650: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
3660: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
3670: 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53    The logic in S
3680: 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67  ELECT processing
3690: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
36a0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
36b0: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  mes of columns i
36c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
36d0: 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f   needs this info
36e0: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
36f0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
3700: 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  y(&pNewExpr->spa
3710: 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70  n, &pOldExpr->sp
3720: 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  an);.    }.    a
3730: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d  ssert( pNewExpr=
3740: 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e  =0 || pNewExpr->
3750: 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20  span.z!=0 .     
3760: 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78         || pOldEx
3770: 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c  pr->span.z==0 ||
3780: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
3790: 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49  failed );.    pI
37a0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
37b0: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
37c0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
37d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
37e0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
37f0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
3800: 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49  m->isAgg = pOldI
3810: 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20  tem->isAgg;.    
3820: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
3830: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
3840: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ew;.}../*.** If 
3850: 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72  cursors, trigger
3860: 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  s, views and sub
3870: 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20  queries are all 
3880: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  omitted from.** 
3890: 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  the build, then 
38a0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  none of the foll
38b0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20  owing routines, 
38c0: 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73  except for .** s
38d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
38e0: 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ), can be called
38f0: 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  . sqlite3SelectD
3900: 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65  up() is sometime
3910: 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  s.** called with
3920: 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74   a NULL argument
3930: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
3940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
3950: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
3960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
3970: 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69  GER) \. || !defi
3980: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3990: 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73  SUBQUERY).SrcLis
39a0: 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
39b0: 74 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70 29  tDup(SrcList *p)
39c0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
39d0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
39e0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
39f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3a00: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
3a10: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
3a20: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
3a30: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
3a40: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
3a50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3a60: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
3a70: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
3a80: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72  n 0;.  pNew->nSr
3a90: 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  c = pNew->nAlloc
3aa0: 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f   = p->nSrc;.  fo
3ab0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63  r(i=0; i<p->nSrc
3ac0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3ad0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3ae0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
3af0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
3b00: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3b10: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
3b20: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
3b30: 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77   *pTab;.    pNew
3b40: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
3b50: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3b60: 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  OldItem->zDataba
3b70: 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  se);.    pNewIte
3b80: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
3b90: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3ba0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
3bb0: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
3bc0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
3bd0: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
3be0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
3bf0: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
3c00: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
3c10: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
3c20: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
3c30: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 54 61  iCursor;.    pTa
3c40: 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54  b = pNewItem->pT
3c50: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ab = pOldItem->p
3c60: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
3c70: 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
3c80: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nRef++;.    }. 
3c90: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65     pNewItem->pSe
3ca0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
3cb0: 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d  lectDup(pOldItem
3cc0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
3cd0: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
3ce0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3cf0: 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  OldItem->pOn);. 
3d00: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
3d10: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
3d20: 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  istDup(pOldItem-
3d30: 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e  >pUsing);.    pN
3d40: 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  ewItem->colUsed 
3d50: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55  = pOldItem->colU
3d60: 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sed;.  }.  retur
3d70: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
3d80: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
3d90: 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  up(IdList *p){. 
3da0: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
3db0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
3dc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3dd0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3de0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
3df0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
3e00: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3e10: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20   0;.  pNew->nId 
3e20: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
3e30: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
3e40: 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  >a = sqliteMallo
3e50: 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69 7a  cRaw( p->nId*siz
3e60: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
3e70: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
3e80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
3e90: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
3ea0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  turn 0;.  }.  fo
3eb0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b  r(i=0; i<p->nId;
3ec0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3ed0: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
3ee0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
3ef0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
3f00: 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70  t IdList_item *p
3f10: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
3f20: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
3f30: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
3f40: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
3f50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
3f60: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
3f70: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
3f80: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3f90: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
3fa0: 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74  SelectDup(Select
3fb0: 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a   *p){.  Select *
3fc0: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
3fd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3fe0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
3ff0: 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
4000: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
4010: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
4020: 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63   pNew->isDistinc
4030: 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
4040: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  t;.  pNew->pELis
4050: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
4060: 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73 74  istDup(p->pEList
4070: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20  );.  pNew->pSrc 
4080: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
4090: 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  Dup(p->pSrc);.  
40a0: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73  pNew->pWhere = s
40b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
40c0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77  >pWhere);.  pNew
40d0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
40e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
40f0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
4100: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
4110: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4120: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e  ->pHaving);.  pN
4130: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
4140: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4150: 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  p(p->pOrderBy);.
4160: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e    pNew->op = p->
4170: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  op;.  pNew->pPri
4180: 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  or = sqlite3Sele
4190: 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72 29  ctDup(p->pPrior)
41a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
41b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
41c0: 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  p(p->pLimit);.  
41d0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
41e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
41f0: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e  ->pOffset);.  pN
4200: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
4210: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
4220: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69   = -1;.  pNew->i
4230: 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69  sResolved = p->i
4240: 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65  sResolved;.  pNe
4250: 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69 73  w->isAgg = p->is
4260: 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75 73 65  Agg;.  pNew->use
4270: 73 56 69 72 74 20 3d 20 30 3b 0a 20 20 70 4e 65  sVirt = 0;.  pNe
4280: 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  w->disallowOrder
4290: 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
42a0: 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
42b0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
42c0: 56 69 72 74 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Virt[0] = -1;.  
42d0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 56 69  pNew->addrOpenVi
42e0: 72 74 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  rt[1] = -1;.  pN
42f0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74  ew->addrOpenVirt
4300: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  [2] = -1;.  retu
4310: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
4320: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
4330: 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74  SelectDup(Select
4340: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4350: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
4360: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
4370: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
4380: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
4390: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
43a0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
43b0: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
43c0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
43d0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
43e0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45  ssion list..*/.E
43f0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
4400: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
4410: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
4420: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
4430: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66  en *pName){.  if
4440: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
4450: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
4460: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
4470: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
4480: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
4490: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
44a0: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  m;.    }.    ass
44b0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ert( pList->nAll
44c0: 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  oc==0 );.  }.  i
44d0: 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  f( pList->nAlloc
44e0: 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <=pList->nExpr )
44f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
4500: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
4510: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74     int n = pList
4520: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a  ->nAlloc*2 + 4;.
4530: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65      a = sqliteRe
4540: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
4550: 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  n*sizeof(pList->
4560: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
4570: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  a==0 ){.      go
4580: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
4590: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
45a0: 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  a;.    pList->nA
45b0: 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  lloc = n;.  }.  
45c0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
45d0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  !=0 );.  if( pEx
45e0: 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20  pr || pName ){. 
45f0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
4600: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
4610: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
4620: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20  ->nExpr++];.    
4630: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
4640: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
4650: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
4660: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
4670: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
4680: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
4690: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a  pr = pExpr;.  }.
46a0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
46b0: 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20  .no_mem:     .  
46c0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
46d0: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
46e0: 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f  c has failed. */
46f0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
4700: 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73  lete(pExpr);.  s
4710: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4720: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
4730: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4740: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
4750: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  re expression li
4760: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
4770: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4780: 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  e(ExprList *pLis
4790: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
47a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
47b0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
47c0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
47d0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
47e0: 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70  List->a!=0 || (p
47f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26  List->nExpr==0 &
4800: 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  & pList->nAlloc=
4810: 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
4820: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70   pList->nExpr<=p
4830: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  List->nAlloc );.
4840: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
4850: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
4860: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
4870: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
4880: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4890: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
48a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
48b0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
48c0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
48d0: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
48e0: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
48f0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
4900: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
4910: 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20   Call xFunc for 
4920: 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65  each node visite
4930: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
4940: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78  urn value from x
4950: 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20  Func determines 
4960: 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65  whether the tree
4970: 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e   walk continues.
4980: 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74  .** 0 means cont
4990: 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65  inue walking the
49a0: 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20   tree.  1 means 
49b0: 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c  do not walk chil
49c0: 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63  dren.** of the c
49d0: 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20  urrent node but 
49e0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69  continue with si
49f0: 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73  blings.  2 means
4a00: 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20   abandon.** the 
4a10: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65  tree walk comple
4a20: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
4a30: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
4a40: 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  m this routine i
4a50: 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  s 1 to abandon t
4a60: 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20  he tree walk.** 
4a70: 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  and 0 to continu
4a80: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a  e..**.** NOTICE:
4a90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
4aa0: 6f 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e  oes *not* descen
4ab0: 64 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65  d into subquerie
4ac0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4ad0: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
4ae0: 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a  prList *, int (*
4af0: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
4b00: 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  , void *);.stati
4b10: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72  c int walkExprTr
4b20: 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ee(Expr *pExpr, 
4b30: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
4b40: 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  d*,Expr*), void 
4b50: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
4b60: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
4b70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
4b80: 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72  c = (*xFunc)(pAr
4b90: 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  g, pExpr);.  if(
4ba0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
4bb0: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
4bc0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75  Expr->pLeft, xFu
4bd0: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
4be0: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61  rn 1;.    if( wa
4bf0: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
4c00: 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c  ->pRight, xFunc,
4c10: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4c20: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
4c30: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
4c40: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
4c50: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
4c60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31   }.  return rc>1
4c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
4c80: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66  walkExprTree() f
4c90: 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
4ca0: 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a  ion in list p..*
4cb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
4cc0: 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  kExprList(ExprLi
4cd0: 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  st *p, int (*xFu
4ce0: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
4cf0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
4d00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
4d10: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
4d20: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21   *pItem;.  if( !
4d30: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
4d40: 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20  for(i=p->nExpr, 
4d50: 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b  pItem=p->a; i>0;
4d60: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
4d70: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
4d80: 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  Tree(pItem->pExp
4d90: 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  r, xFunc, pArg) 
4da0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
4db0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4dc0: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
4dd0: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
4de0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
4df0: 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69   Select p, not i
4e00: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72  ncluding.** expr
4e10: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
4e20: 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c   part of sub-sel
4e30: 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d  ects in any FROM
4e40: 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c   clause or the L
4e50: 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45  IMIT.** or OFFSE
4e60: 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a  T expressions...
4e70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
4e80: 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c  lkSelectExpr(Sel
4e90: 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ect *p, int (*xF
4ea0: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
4eb0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
4ec0: 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  {.  walkExprList
4ed0: 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e  (p->pEList, xFun
4ee0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
4ef0: 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65  ExprTree(p->pWhe
4f00: 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  re, xFunc, pArg)
4f10: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
4f20: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46  (p->pGroupBy, xF
4f30: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
4f40: 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48  lkExprTree(p->pH
4f50: 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41  aving, xFunc, pA
4f60: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c  rg);.  walkExprL
4f70: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
4f80: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
4f90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
4fa0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4fb0: 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73  e is designed as
4fc0: 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
4fd0: 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a  lkExprTree()..**
4fe0: 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c  .** pArg is real
4ff0: 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
5000: 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20  an integer.  If 
5010: 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c  we can tell by l
5020: 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78  ooking.** at pEx
5030: 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70 72  pr that the expr
5040: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74  ession that cont
5050: 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f  ains pExpr is no
5060: 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  t a constant.** 
5070: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
5080: 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20   set *pArg to 0 
5090: 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20  and return 2 to 
50a0: 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65  abandon the tree
50b0: 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78   walk..** If pEx
50c0: 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74  pr does does not
50d0: 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 20   disqualify the 
50e0: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
50f0: 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74  being a constant
5100: 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  .** then do noth
5110: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ing..**.** After
5120: 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f   walking the who
5130: 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e  le tree, if no n
5140: 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74  odes are found t
5150: 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a  hat disqualify.*
5160: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
5170: 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68   as constant, th
5180: 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68 65  en we assume the
5190: 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f   whole expressio
51a0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74  n.** is constant
51b0: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
51c0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66  prIsConstant() f
51d0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
51e0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
51f0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64  atic int exprNod
5200: 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64  eIsConstant(void
5210: 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
5220: 78 70 72 29 7b 0a 20 20 73 77 69 74 63 68 28 20  xpr){.  switch( 
5230: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
5240: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e   /* Consider fun
5250: 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e  ctions to be con
5260: 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65  stant if all the
5270: 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ir arguments are
5280: 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a   constant.    **
5290: 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f   and *pArg==2 */
52a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
52b0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
52c0: 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 3d 3d   *((int*)pArg)==
52d0: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
52e0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
52f0: 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ugh */.    case 
5300: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
5310: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
5320: 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20  ase TK_DOT:.    
5330: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
5340: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
5350: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69  K_AGG_COLUMN:.#i
5360: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5370: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
5380: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
5390: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
53a0: 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  S:.#endif.      
53b0: 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20  *((int*)pArg) = 
53c0: 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
53d0: 32 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  2;.    case TK_I
53e0: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  N:.      if( pEx
53f0: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
5400: 20 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70         *((int*)p
5410: 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  Arg) = 0;.      
5420: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
5430: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5440: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
5450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  .  }.}../*.** Wa
5460: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
5470: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
5480: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
5490: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
54a0: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
54b0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
54c0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
54d0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
54e0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
54f0: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
5500: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
5510: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
5520: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
5530: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
5540: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
5550: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
5560: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
5570: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
5580: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
5590: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  t(Expr *p){.  in
55a0: 74 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20  t isConst = 1;. 
55b0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c   walkExprTree(p,
55c0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
55d0: 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a  ant, &isConst);.
55e0: 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74    return isConst
55f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
5600: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
5610: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
5620: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5630: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
5640: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
5650: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
5660: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
5670: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
5680: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
5690: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
56a0: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
56b0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
56c0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
56d0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
56e0: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
56f0: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
5700: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
5710: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
5720: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
5730: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
5740: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
5750: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
5760: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
5770: 69 73 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77  isConst = 2;.  w
5780: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
5790: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
57a0: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
57b0: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d  return isConst!=
57c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
57d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
57e0: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
57f0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
5800: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
5810: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
5820: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
5830: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
5840: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
5850: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
5860: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
5870: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
5880: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
5890: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
58a0: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
58b0: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
58c0: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
58d0: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
58e0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
58f0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
5900: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
5910: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
5920: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
5930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
5940: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
5950: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
5960: 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56  2(p->token.z, pV
5970: 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20  alue) ){.       
5980: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5990: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
59a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
59b0: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
59c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
59d0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
59e0: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
59f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
5a00: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
5a10: 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
5a20: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
5a30: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
5a40: 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
5a50: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
5a60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5a70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5a80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5a90: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
5aa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5ac0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
5ad0: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
5ae0: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
5af0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5b00: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
5b10: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
5b20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5b30: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
5b40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
5b50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5b60: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
5b70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
5b80: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5b90: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
5ba0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
5bb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0;.}../*.** Giv
5bc0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
5bd0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
5be0: 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a  orm X.Y.Z or Y.Z
5bf0: 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b   or just Z, look
5c00: 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65   up.** that name
5c10: 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73   in the set of s
5c20: 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20  ource tables in 
5c30: 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b  pSrcList and mak
5c40: 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20  e the pExpr .** 
5c50: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
5c60: 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68  refer back to th
5c70: 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e  at source column
5c80: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
5c90: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
5ca0: 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a  made to pExpr:.*
5cb0: 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  *.**    pExpr->i
5cc0: 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74  Db           Set
5cd0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62   the index in db
5ce0: 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64  ->aDb[] of the d
5cf0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a  atabase holding.
5d00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
5d10: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
5d20: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70  able..**    pExp
5d30: 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20  r->iTable       
5d40: 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73   Set to the curs
5d50: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
5d60: 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64  e table obtained
5d70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
5d90: 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20   pSrcList..**   
5da0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
5db0: 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65        Set to the
5dc0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
5dd0: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ithin the table.
5de0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .**    pExpr->op
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
5e00: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a  to TK_COLUMN..**
5e10: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
5e20: 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70           Any exp
5e30: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
5e40: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
5e50: 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  d.**    pExpr->p
5e60: 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79  Right        Any
5e70: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
5e80: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
5e90: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
5ea0: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65   pDbToken is the
5eb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
5ec0: 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e  abase (the "X").
5ed0: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
5ee0: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e   be.** NULL mean
5ef0: 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73  ing that name is
5f00: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a   of the form Y.Z
5f10: 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69   or Z.  Any avai
5f20: 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a  lable database.*
5f30: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20  * can be used.  
5f40: 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20  The pTableToken 
5f50: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
5f60: 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59  he table (the "Y
5f70: 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c  ").  This.** val
5f80: 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69  ue can be NULL i
5f90: 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c  f pDbToken is al
5fa0: 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61  so NULL.  If pTa
5fb0: 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  bleToken is NULL
5fc0: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61   it.** means tha
5fd0: 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68  t the form of th
5fe0: 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20  e name is Z and 
5ff0: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  that columns fro
6000: 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63  m any table.** c
6010: 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  an be used..**.*
6020: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61  * If the name ca
6030: 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64  nnot be resolved
6040: 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20   unambiguously, 
6050: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
6060: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
6070: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
6080: 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e  on-zero.  Return
6090: 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
60a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
60b0: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61  lookupName(.  Pa
60c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
60d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
60e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
60f0: 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20  oken *pDbToken, 
6100: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
6110: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
6120: 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72  aining table, or
6130: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
6140: 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20   *pTableToken,  
6150: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
6160: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
6170: 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  mn, or NULL */. 
6180: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54   Token *pColumnT
6190: 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  oken, /* Name of
61a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a   the column. */.
61b0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
61c0: 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  NC,    /* The na
61d0: 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20  me context used 
61e0: 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e  to resolve the n
61f0: 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
6200: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Expr          /*
6210: 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20   Make this EXPR 
6220: 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  node point to th
6230: 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d  e selected colum
6240: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  n */.){.  char *
6250: 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  zDb = 0;       /
6260: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
6270: 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22  tabase.  The "X"
6280: 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63   in X.Y.Z */.  c
6290: 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20  har *zTab = 0;  
62a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
62b0: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22  he table.  The "
62c0: 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59  Y" in X.Y.Z or Y
62d0: 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  .Z */.  char *zC
62e0: 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ol = 0;      /* 
62f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
6300: 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a  mn.  The "Z" */.
6310: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
6320: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
6330: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
6340: 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20   cnt = 0;       
6350: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
6360: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
6370: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ames */.  int cn
6380: 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  tTab = 0;      /
6390: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
63a0: 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73  hing table names
63b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
63c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
63d0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
63e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
63f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
6400: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66  ;       /* Use f
6410: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
6420: 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a  pSrcList items *
6430: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
6440: 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20  st_item *pMatch 
6450: 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74  = 0;  /* The mat
6460: 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69  ching pSrcList i
6470: 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  tem */.  NameCon
6480: 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70  text *pTopNC = p
6490: 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  NC;        /* Fi
64a0: 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20  rst namecontext 
64b0: 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a  in the list */..
64c0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d    assert( pColum
64d0: 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d  nToken && pColum
64e0: 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20  nToken->z ); /* 
64f0: 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63  The Z in X.Y.Z c
6500: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
6510: 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33  .  zDb = sqlite3
6520: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44  NameFromToken(pD
6530: 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20  bToken);.  zTab 
6540: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
6550: 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b  mToken(pTableTok
6560: 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71  en);.  zCol = sq
6570: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
6580: 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29  en(pColumnToken)
6590: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
65a0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
65b0: 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70  .    goto lookup
65c0: 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  name_end;.  }.. 
65d0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
65e0: 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e   -1;.  while( pN
65f0: 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20  C && cnt==0 ){. 
6600: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
6610: 69 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  ist;.    SrcList
6620: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
6630: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20  ->pSrcList;..   
6640: 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b   if( pSrcList ){
6650: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
6660: 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e  pItem=pSrcList->
6670: 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  a; i<pSrcList->n
6680: 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
6690: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  +){.        Tabl
66a0: 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
66b0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 43  >pTab;.        C
66c0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a  olumn *pCol;.  .
66d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
66e0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
66f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6700: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
6710: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
6720: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6730: 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
6740: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
6750: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
6760: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pItem->zAlias;. 
6770: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
6780: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
6790: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
67a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
67b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
67c0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
67d0: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
67e0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
67f0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
6800: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
6810: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
6820: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
6830: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
6840: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
6850: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
6860: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
6870: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20  .zName, zDb)!=0 
6880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6890: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
68a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
68b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
68c0: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63         if( 0==(c
68d0: 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20  ntTab++) ){.    
68e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
68f0: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
6900: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
6910: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
6920: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20  b->iDb;.        
6930: 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d    pMatch = pItem
6940: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6950: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f      for(j=0, pCo
6960: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
6970: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
6980: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
6990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
69a0: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
69b0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 49 64 4c 69              IdLi
69d0: 73 74 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20  st *pUsing;.    
69e0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
69f0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6a00: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d  ->iTable = pItem
6a10: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
6a20: 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
6a30: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  pItem;.         
6a40: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20     pExpr->iDb = 
6a50: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20  pTab->iDb;.     
6a60: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69         /* Substi
6a70: 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28  tute the rowid (
6a80: 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74  column -1) for t
6a90: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
6aa0: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20  RY KEY */.      
6ab0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
6ac0: 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e  lumn = j==pTab->
6ad0: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a  iPKey ? -1 : j;.
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
6af0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
6b00: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69  ab->aCol[j].affi
6b10: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nity;.          
6b20: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
6b30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70   pTab->aCol[j].p
6b40: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
6b50: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69    if( pItem->joi
6b60: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
6b70: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
6b80: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d      /* If this m
6b90: 61 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e  atch occurred in
6ba0: 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
6bb0: 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69  of a natural joi
6bc0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
6bd0: 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68   ** then skip th
6be0: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f  e right table to
6bf0: 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61   avoid a duplica
6c00: 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  te match */.    
6c10: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b            pItem+
6c20: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
6c30: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
6c40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6c50: 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49  if( (pUsing = pI
6c60: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 21 3d 30 20  tem->pUsing)!=0 
6c70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6c80: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
6c90: 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f  h occurs on a co
6ca0: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20  lumn that is in 
6cb0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
6cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
6cd0: 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69  * of a join, ski
6ce0: 70 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20  p the search of 
6cf0: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
6d00: 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20  of the join.    
6d10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
6d20: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
6d30: 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a  e match there. *
6d40: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
6d50: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
6d60: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
6d70: 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b  pUsing->nId; k++
6d80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6d90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6da0: 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b  rICmp(pUsing->a[
6db0: 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  k].zName, zCol)=
6dc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6dd0: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b          pItem++;
6de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6df0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
6e00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e20: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
6e30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
6e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
6e50: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
6e60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6e70: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
6e80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
6e90: 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77  GGER.    /* If w
6ea0: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
6eb0: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20  dy resolved the 
6ec0: 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65  name, then maybe
6ed0: 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61   .    ** it is a
6ee0: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
6ef0: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
6f00: 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a   reference.    *
6f10: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  /.    if( zDb==0
6f20: 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63   && zTab!=0 && c
6f30: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  nt==0 && pParse-
6f40: 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b  >trigStack!=0 ){
6f50: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74  .      TriggerSt
6f60: 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61  ack *pTriggerSta
6f70: 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69  ck = pParse->tri
6f80: 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61  gStack;.      Ta
6f90: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
6fa0: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
6fb0: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
6fc0: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
6fd0: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
6fe0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
6ff0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7000: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
7010: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
7020: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
7030: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
7040: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
7050: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
7060: 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pTab;.      }els
7070: 65 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74  e if( pTriggerSt
7080: 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d  ack->oldIdx != -
7090: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
70a0: 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29  Cmp("old", zTab)
70b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
70c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
70d0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
70e0: 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  dIdx;.        as
70f0: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
7100: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
7110: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
7120: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
7130: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7140: 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20  if( pTab ){ .   
7150: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
7160: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c      Column *pCol
7170: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a   = pTab->aCol;..
7180: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
7190: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
71a0: 20 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b          cntTab++
71b0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
71c0: 30 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f  0; j < pTab->nCo
71d0: 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20  l; j++, pCol++) 
71e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
71f0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
7200: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
7210: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7220: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
7230: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
7240: 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d  olumn = j==pTab-
7250: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b  >iPKey ? -1 : j;
7260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
7270: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70  pr->affinity = p
7280: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
7290: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
72a0: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
72b0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
72c0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
72d0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
72e0: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
72f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
7320: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
7330: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
7340: 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a  GGER) */..    /*
7350: 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20  .    ** Perhaps 
7360: 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65  the name is a re
7370: 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52  ference to the R
7380: 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20  OWID.    */.    
7390: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e  if( cnt==0 && cn
73a0: 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74  tTab==1 && sqlit
73b0: 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20  e3IsRowid(zCol) 
73c0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31  ){.      cnt = 1
73d0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
73e0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
73f0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
7400: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
7410: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 0a  NUMERIC;.    }..
7420: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
7430: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66   the input is of
7440: 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74   the form Z (not
7450: 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74   Y.Z or X.Y.Z) t
7460: 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20  hen the name Z. 
7470: 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65     ** might refe
7480: 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73  r to an result-s
7490: 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20  et alias.  This 
74a0: 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
74b0: 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a  mple, when.    *
74c0: 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69  * we are resolvi
74d0: 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ng names in the 
74e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
74f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
7500: 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mmand:.    **.  
7510: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
7520: 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61  a+b AS x FROM ta
7530: 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a  ble WHERE x<10;.
7540: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
7550: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
7560: 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20  , replace pExpr 
7570: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
7580: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
7590: 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20  at.    ** forms 
75a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65  the result set e
75b0: 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74  ntry ("a+b" in t
75c0: 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20  he example) and 
75d0: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
75e0: 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20  ly..    ** Note 
75f0: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
7600: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
7610: 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  t set should hav
7620: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  e already been. 
7630: 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62     ** resolved b
7640: 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57  y the time the W
7650: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72  HERE clause is r
7660: 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a  esolved..    */.
7670: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
7680: 26 20 28 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d  & (pEList = pNC-
7690: 3e 70 45 4c 69 73 74 29 21 3d 30 20 26 26 20 7a  >pEList)!=0 && z
76a0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
76b0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
76c0: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
76d0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41          char *zA
76e0: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  s = pEList->a[j]
76f0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
7700: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
7710: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
7720: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
7730: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7740: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
7750: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
7760: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
7770: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
7780: 41 53 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  AS;.          pE
7790: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
77a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
77b0: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
77c0: 65 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74  e3ExprDup(pEList
77d0: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[j].pExpr);. 
77e0: 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31           cnt = 1
77f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
7800: 72 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a  rt( zTab==0 && z
7810: 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  Db==0 );.       
7820: 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61     goto lookupna
7830: 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20  me_end_2;.      
7840: 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20    }.      } .   
7850: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e   }..    /* Advan
7860: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e  ce to the next n
7870: 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68  ame context.  Th
7880: 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74  e loop will exit
7890: 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20   when either.   
78a0: 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61   ** we have a ma
78b0: 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77  tch (cnt>0) or w
78c0: 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f  hen we run out o
78d0: 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e  f name contexts.
78e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
78f0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  cnt==0 ){.      
7900: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
7910: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7920: 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20  *.  ** If X and 
7930: 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f  Y are NULL (in o
7940: 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e  ther words if on
7950: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
7960: 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70  me Z is.  ** sup
7970: 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76  plied) and the v
7980: 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63  alue of Z is enc
7990: 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d  losed in double-
79a0: 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a  quotes, then.  *
79b0: 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20  * Z is a string 
79c0: 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f  literal if it do
79d0: 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20  esn't match any 
79e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
79f0: 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65  n that.  ** case
7a00: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74  , we need to ret
7a10: 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61  urn right away a
7a20: 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20  nd not make any 
7a30: 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20  changes to.  ** 
7a40: 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pExpr..  **.  **
7a50: 20 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65   Because no refe
7a60: 72 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74  rence was made t
7a70: 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73  o outer contexts
7a80: 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a  , the pNC->nRef.
7a90: 20 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20    ** fields are 
7aa0: 6e 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61  not changed in a
7ab0: 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f  ny context..  */
7ac0: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26  .  if( cnt==0 &&
7ad0: 20 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c   zTab==0 && pCol
7ae0: 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d  umnToken->z[0]==
7af0: 27 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '"' ){.    sqlit
7b00: 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20  eFree(zCol);.   
7b10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
7b20: 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30    /*.  ** cnt==0
7b30: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61 73   means there was
7b40: 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74   not match.  cnt
7b50: 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77  >1 means there w
7b60: 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20  ere two or.  ** 
7b70: 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45  more matches.  E
7b80: 69 74 68 65 72 20 77 61 79 2c 20 77 65 20 68 61  ither way, we ha
7b90: 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  ve an error..  *
7ba0: 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29  /.  if( cnt!=1 )
7bb0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
7bc0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  0;.    char *zEr
7bd0: 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e  r;.    zErr = cn
7be0: 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20  t==0 ? "no such 
7bf0: 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61  column: %s" : "a
7c00: 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20  mbiguous column 
7c10: 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20 69  name: %s";.    i
7c20: 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20  f( zDb ){.      
7c30: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
7c40: 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a  (&z, zDb, ".", z
7c50: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
7c60: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
7c70: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
7c80: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
7c90: 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  (&z, zTab, ".", 
7ca0: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65  zCol, 0);.    }e
7cb0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
7cc0: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 43 6f 6c  qliteStrDup(zCol
7cd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7ce0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7cf0: 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20  rse, zErr, z);. 
7d00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
7d10: 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45  ;.    pTopNC->nE
7d20: 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rr++;.  }..  /* 
7d30: 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  If a column from
7d40: 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63   a table in pSrc
7d50: 4c 69 73 74 20 69 73 20 72 65 66 65 72 65 6e 63  List is referenc
7d60: 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a  ed, then record.
7d70: 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69    ** this fact i
7d80: 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61  n the pSrcList.a
7d90: 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61  [].colUsed bitma
7da0: 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61  sk.  Column 0 ca
7db0: 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20  uses.  ** bit 0 
7dc0: 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75  to be set.  Colu
7dd0: 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20 31 2e  mn 1 sets bit 1.
7de0: 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
7df0: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c   If the.  ** col
7e00: 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72  umn number is gr
7e10: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e  eater than the n
7e20: 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e  umber of bits in
7e30: 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
7e40: 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 68  * then set the h
7e50: 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66  igh-order bit of
7e60: 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20   the bitmask..  
7e70: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
7e80: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d  iColumn>=0 && pM
7e90: 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69  atch!=0 ){.    i
7ea0: 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt n = pExpr->iC
7eb0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e  olumn;.    if( n
7ec0: 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  >=sizeof(Bitmask
7ed0: 29 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  )*8 ){.      n =
7ee0: 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29   sizeof(Bitmask)
7ef0: 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *8-1;.    }.    
7f00: 61 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e  assert( pMatch->
7f10: 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e  iCursor==pExpr->
7f20: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d  iTable );.    pM
7f30: 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d  atch->colUsed |=
7f40: 20 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b   1<<n;.  }..look
7f50: 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a  upname_end:.  /*
7f60: 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   Clean up and re
7f70: 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
7f80: 74 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73  teFree(zDb);.  s
7f90: 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b  qliteFree(zTab);
7fa0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
7fb0: 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  lete(pExpr->pLef
7fc0: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65  t);.  pExpr->pLe
7fd0: 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ft = 0;.  sqlite
7fe0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
7ff0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
8000: 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b  xpr->pRight = 0;
8010: 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  .  pExpr->op = T
8020: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70  K_COLUMN;.lookup
8030: 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73 71  name_end_2:.  sq
8040: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a  liteFree(zCol);.
8050: 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a    if( cnt==1 ){.
8060: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 21      assert( pNC!
8070: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
8080: 33 41 75 74 68 52 65 61 64 28 70 50 61 72 73 65  3AuthRead(pParse
8090: 2c 20 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70 53  , pExpr, pNC->pS
80a0: 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  rcList);.    if(
80b0: 20 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74   pMatch && !pMat
80c0: 63 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ch->pSelect ){. 
80d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
80e0: 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b   = pMatch->pTab;
80f0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e  .    }.    /* In
8100: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66  crement the nRef
8110: 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61   value on all na
8120: 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d  me contexts from
8130: 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20   TopNC up to.   
8140: 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68   ** the point wh
8150: 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74  ere the name mat
8160: 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ched. */.    for
8170: 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  (;;){.      asse
8180: 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b  rt( pTopNC!=0 );
8190: 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e  .      pTopNC->n
81a0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Ref++;.      if(
81b0: 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62   pTopNC==pNC ) b
81c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70  reak;.      pTop
81d0: 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65  NC = pTopNC->pNe
81e0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  xt;.    }.    re
81f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65  turn 0;.  } else
8200: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b   {.    return 1;
8210: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
8220: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65  is routine is de
8230: 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75  signed as an xFu
8240: 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54  nc for walkExprT
8250: 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73  ree()..**.** Res
8260: 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61  olve symbolic na
8270: 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55  mes into TK_COLU
8280: 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  MN operators for
8290: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
82a0: 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72  node in the expr
82b0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
82c0: 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e  turn 0 to contin
82d0: 75 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f  ue the search do
82e0: 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f  wn.** the tree o
82f0: 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65  r 2 to abort the
8300: 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a   tree walk..**.*
8310: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
8320: 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63  lso does error c
8330: 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65  hecking and name
8340: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a   resolution for.
8350: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
8360: 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72  s.  The operator
8370: 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
8380: 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e  unctions is chan
8390: 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47  ged.** to TK_AGG
83a0: 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74  _FUNCTION..*/.st
83b0: 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73  atic int nameRes
83c0: 6f 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a  olverStep(void *
83d0: 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
83e0: 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  r){.  NameContex
83f0: 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f  t *pNC = (NameCo
8400: 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 53  ntext*)pArg;.  S
8410: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
8420: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
8430: 65 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  e;..  if( pExpr=
8440: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
8450: 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20   assert( pNC!=0 
8460: 29 3b 0a 20 20 70 53 72 63 4c 69 73 74 20 3d 20  );.  pSrcList = 
8470: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
8480: 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70   pParse = pNC->p
8490: 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78  Parse;..  if( Ex
84a0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
84b0: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
84c0: 76 65 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b  ved) ) return 1;
84d0: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
84e0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
84f0: 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20  olved);.#ifndef 
8500: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 53 72  NDEBUG.  if( pSr
8510: 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69 73  cList && pSrcLis
8520: 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20  t->nAlloc>0 ){. 
8530: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
8540: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
8550: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
8560: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
8570: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
8580: 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69  sor>=0 && pSrcLi
8590: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
85a0: 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a  <pParse->nTab);.
85b0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
85c0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
85d0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ->op ){.    /* D
85e0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
85f0: 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29  ings (ex: "abc")
8600: 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65   are used as ide
8610: 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20  ntifiers if.    
8620: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74  ** possible.  Ot
8630: 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d  herwise they rem
8640: 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20  ain as strings. 
8650: 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20   Single-quoted. 
8660: 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65     ** strings (e
8670: 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c  x: 'abc') are al
8680: 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65  ways string lite
8690: 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rals..    */.   
86a0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
86b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
86c0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
86d0: 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  '\'' ) break;.  
86e0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
86f0: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20   into the TK_ID 
8700: 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20  case if this is 
8710: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
8720: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a  string */.    }.
8730: 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64      /* A lone id
8740: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
8750: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
8760: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
8770: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
8780: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
8790: 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70 72  se, 0, 0, &pExpr
87a0: 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45  ->token, pNC, pE
87b0: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
87c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  rn 1;.    }.  . 
87d0: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61     /* A table na
87e0: 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61  me and column na
87f0: 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20 20  me:     ID.ID.  
8800: 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61    ** Or a databa
8810: 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  se, table and co
8820: 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a  lumn:  ID.ID.ID.
8830: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
8840: 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_DOT: {.      
8850: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a  Token *pColumn;.
8860: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61        Token *pTa
8870: 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  ble;.      Token
8880: 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78 70   *pDb;.      Exp
8890: 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20  r *pRight;..    
88a0: 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73    /* if( pSrcLis
88b0: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f  t==0 ) break; */
88c0: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
88d0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
88e0: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
88f0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
8900: 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a 20        pDb = 0;. 
8910: 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20         pTable = 
8920: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
8930: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  oken;.        pC
8940: 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d  olumn = &pRight-
8950: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  >token;.      }e
8960: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
8970: 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d  ert( pRight->op=
8980: 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_DOT );.     
8990: 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72 2d     pDb = &pExpr-
89a0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
89b0: 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20         pTable = 
89c0: 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e  &pRight->pLeft->
89d0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
89e0: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
89f0: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b  ->pRight->token;
8a00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c  .      }.      l
8a10: 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65  ookupName(pParse
8a20: 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20 70  , pDb, pTable, p
8a30: 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78  Column, pNC, pEx
8a40: 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  pr);.      retur
8a50: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
8a60: 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74  /* Resolve funct
8a70: 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f  ion names.    */
8a80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
8a90: 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73  ST_FUNC:.    cas
8aa0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
8ab0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8ac0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
8ad0: 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
8ae0: 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a   argument list *
8af0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  /.      int n = 
8b00: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
8b10: 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e 75  Expr : 0;  /* Nu
8b20: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8b30: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
8b40: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b  o_such_func = 0;
8b50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
8b60: 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69  f no such functi
8b70: 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  on exists */.   
8b80: 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d     int wrong_num
8b90: 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f  _args = 0;     /
8ba0: 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20  * True if wrong 
8bb0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
8bc0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
8bd0: 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20   is_agg = 0;    
8be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
8bf0: 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67   if is an aggreg
8c00: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
8c10: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
8c20: 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20     int nId;     
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8c40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
8c50: 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69  acters in functi
8c60: 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
8c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
8c80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8c90: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
8ca0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  e. */.      Func
8cb0: 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
8cc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
8cd0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
8ce0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
8cf0: 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 70 50 61     int enc = pPa
8d00: 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 20 20 2f  rse->db->enc;  /
8d10: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65  * The database e
8d20: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  ncoding */..    
8d30: 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 74    zId = pExpr->t
8d40: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
8d50: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
8d60: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
8d70: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
8d80: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
8d90: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e   zId, nId, n, en
8da0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  c, 0);.      if(
8db0: 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
8dc0: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
8dd0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
8de0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
8df0: 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29  nId, -1, enc, 0)
8e00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
8e10: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
8e20: 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20     no_such_func 
8e30: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
8e40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72  se{.          wr
8e50: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31  ong_num_args = 1
8e60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8e80: 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e   is_agg = pDef->
8e90: 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20  xFunc==0;.      
8ea0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
8eb0: 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f  gg && !pNC->allo
8ec0: 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  wAgg ){.        
8ed0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8ee0: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
8ef0: 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
8f00: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e  ction %.*s()", n
8f10: 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  Id,zId);.       
8f20: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
8f30: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
8f40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8f50: 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29  ( no_such_func )
8f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8f80: 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  , "no such funct
8f90: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c  ion: %.*s", nId,
8fa0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
8fb0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
8fc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e    }else if( wron
8fd0: 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20  g_num_args ){.  
8fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8ff0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72  orMsg(pParse,"wr
9000: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
9010: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
9020: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20  ion %.*s()",.   
9030: 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a            nId, z
9040: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
9050: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
9060: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
9070: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  gg ){.        pE
9080: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
9090: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
90a0: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
90b0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
90c0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
90d0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  NC->allowAgg = 0
90e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
90f0: 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26   pNC->nErr==0 &&
9100: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
9110: 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65      walkExprTree
9120: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
9130: 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  pr, nameResolver
9140: 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20  Step, pNC);.    
9150: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
9160: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
9170: 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  wAgg = 1;.      
9180: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70  /* FIX ME:  Comp
9190: 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ute pExpr->affin
91a0: 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ity based on the
91b0: 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e   expected return
91c0: 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f  .      ** type o
91d0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a  f the function .
91e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
91f0: 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20  eturn is_agg;.  
9200: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9210: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9220: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
9230: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
9240: 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a  _EXISTS:.#endif.
9250: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
9260: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
9270: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 23 69  r->pSelect ){.#i
9280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9290: 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20  T_CHECK.        
92a0: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
92b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
92c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
92d0: 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73  arse,"subqueries
92e0: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
92f0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
9300: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ");.        }.#e
9310: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
9320: 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65   nRef = pNC->nRe
9330: 66 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  f;.        sqlit
9340: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
9350: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9360: 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20  Select, pNC);.  
9370: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
9380: 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b  C->nRef>=nRef );
9390: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65  .        if( nRe
93a0: 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a  f!=pNC->nRef ){.
93b0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
93c0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
93d0: 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a   EP_VarSelect);.
93e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
93f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9400: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
9410: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
9420: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
9430: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  BLE: {.      if(
9440: 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b   pNC->isCheck ){
9450: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9460: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9470: 22 70 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68  "parameters proh
9480: 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20  ibited in CHECK 
9490: 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
94a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
94b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
94c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
94d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
94e0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
94f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
9500: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
9510: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
9520: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f  ble columns.  No
9530: 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  des of the form 
9540: 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f  ID.ID or ID reso
9550: 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69  lve into an.** i
9560: 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c  ndex to the tabl
9570: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
9580: 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e  ist and a column
9590: 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a   offset.  The .*
95a0: 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f  * Expr.opcode fo
95b0: 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20  r such nodes is 
95c0: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
95d0: 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e  LUMN.  The Expr.
95e0: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
95f0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
9600: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  e index of the r
9610: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
9620: 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70  in pTabList.** p
9630: 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76  lus the "base" v
9640: 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20  alue.  The base 
9650: 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d  value will ultim
9660: 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65  ately become the
9670: 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20  .** VDBE cursor 
9680: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72  number for a cur
9690: 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
96a0: 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65  ting into the re
96b0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c  ferenced.** tabl
96c0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
96d0: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68  lumn value is ch
96e0: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
96f0: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
9700: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65   .** of the refe
9710: 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54  renced table.  T
9720: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
9730: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70  value for the sp
9740: 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63  ecial.** ROWID c
9750: 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e  olumn is -1.  An
9760: 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  y INTEGER PRIMAR
9770: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20  Y KEY column is 
9780: 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61  tried as an.** a
9790: 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a  lias for ROWID..
97a0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f 6c  **.** Also resol
97b0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
97c0: 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65 20  s and check the 
97d0: 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70 72  functions for pr
97e0: 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20 20  oper.** usage.  
97f0: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66 75  Make sure all fu
9800: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65  nction names are
9810: 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
9820: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  all functions.**
9830: 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65 63   have the correc
9840: 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  t number of argu
9850: 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e  ments.  Leave an
9860: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
9870: 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  * in pParse->zEr
9880: 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e 67  rMsg if anything
9890: 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75   is amiss.  Retu
98a0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
98b0: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
98c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
98d0: 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67   contains aggreg
98e0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ate functions th
98f0: 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41 67  en set the EP_Ag
9900: 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e  g.** property on
9910: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
9920: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9930: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
9940: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
9950: 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61  pNC,       /* Na
9960: 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c  mespace to resol
9970: 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ve expressions i
9980: 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  n. */.  Expr *pE
9990: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
99a0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
99b0: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
99c0: 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61  . */.){.  int sa
99d0: 76 65 64 48 61 73 41 67 67 3b 0a 20 20 69 66 28  vedHasAgg;.  if(
99e0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
99f0: 72 6e 20 30 3b 0a 20 20 73 61 76 65 64 48 61 73  rn 0;.  savedHas
9a00: 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67  Agg = pNC->hasAg
9a10: 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67  g;.  pNC->hasAgg
9a20: 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 0;.  walkExpr
9a30: 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65  Tree(pExpr, name
9a40: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
9a50: 43 29 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e  C);.  if( pNC->n
9a60: 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  Err>0 ){.    Exp
9a70: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
9a80: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20  pr, EP_Error);. 
9a90: 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61   }.  if( pNC->ha
9aa0: 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72  sAgg ){.    Expr
9ab0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
9ac0: 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65  r, EP_Agg);.  }e
9ad0: 6c 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73  lse if( savedHas
9ae0: 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  Agg ){.    pNC->
9af0: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  hasAgg = 1;.  }.
9b00: 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
9b10: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
9b20: 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a  EP_Error);.}../*
9b30: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e  .** A pointer in
9b40: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
9b50: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
9b60: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
9b70: 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  tion.** through 
9b80: 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74  walkExprTree int
9b90: 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79 53 74  o codeSubquerySt
9ba0: 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ep()..*/.typedef
9bb0: 20 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64   struct QueryCod
9bc0: 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73  er QueryCoder;.s
9bd0: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
9be0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
9bf0: 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se;       /* The
9c00: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
9c10: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
9c20: 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  t *pNC;    /* Na
9c30: 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72 73 74  mespace of first
9c40: 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79   enclosing query
9c50: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47   */.};.../*.** G
9c60: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
9c70: 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64 20   subqueries and 
9c80: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a  IN operators..**
9c90: 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  .** IN operators
9ca0: 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 20 66 6f   comes in two fo
9cb0: 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rms:.**.**      
9cc0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
9cd0: 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a  prlist).** and.*
9ce0: 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72  *           expr
9cf0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
9d00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
9d10: 20 66 6f 72 6d 20 69 73 20 68 61 6e 64 6c 65 64   form is handled
9d20: 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
9d30: 65 74 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6c  et holding the l
9d40: 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65  ist.** of allowe
9d50: 64 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 73  d values.  The s
9d60: 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61 75 73 65  econd form cause
9d70: 73 20 74 68 65 20 53 45 4c 45 43 54 20 74 6f 20  s the SELECT to 
9d80: 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20 61 20 74  generate .** a t
9d90: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a  emporary table..
9da0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9db0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9dc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
9dd0: 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
9de0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
9df0: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 74 65 73  Expr){.  int tes
9e00: 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20  tAddr = 0;      
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
9e30: 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56  t address */.  V
9e40: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
9e50: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9e60: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
9e70: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  turn;..  /* This
9e80: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
9e90: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
9ea0: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
9eb0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
9ec0: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
9ed0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
9ee0: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
9ef0: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
9f00: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
9f10: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
9f20: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
9f30: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
9f40: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
9f50: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
9f60: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
9f70: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
9f80: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
9f90: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
9fa0: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
9fb0: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
9fc0: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
9fd0: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
9fe0: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
9ff0: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
a000: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
a010: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
a020: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
a030: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
a040: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
a050: 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21  _VarSelect) && !
a060: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
a070: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  k ){.    int mem
a080: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
a090: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
a0a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
a0b0: 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a  mLoad, mem, 0);.
a0c0: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73      testAddr = s
a0d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a0e0: 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29 3b  v, OP_If, 0, 0);
a0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73  .    assert( tes
a100: 74 41 64 64 72 3e 30 20 7c 7c 20 73 71 6c 69 74  tAddr>0 || sqlit
a110: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
a120: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
a130: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a140: 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a  emInt, 1, mem);.
a150: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
a160: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
a170: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
a180: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
a190: 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  y;.      KeyInfo
a1a0: 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20   keyInfo;.      
a1b0: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
a1c0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
a1d0: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 69 6e  P_OpenVirtual in
a1e0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
a1f0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
a200: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a210: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
a220: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
a230: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
a240: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
a250: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
a260: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
a270: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
a280: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
a290: 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72 74  same way. A virt
a2a0: 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ual table is .  
a2b0: 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
a2c0: 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20  th single-field 
a2d0: 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
a2e0: 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
a2f0: 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  lts.      ** fro
a300: 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20  m the SELECT or 
a310: 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a  the <exprlist>..
a320: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
a330: 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70  * If the 'x' exp
a340: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
a350: 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68  umn value, or th
a360: 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20  e SELECT....    
a370: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
a380: 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
a390: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
a3a0: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
a3b0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
a3c0: 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
a3d0: 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
a3e0: 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
a3f0: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53  d the.      ** S
a400: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
a410: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
a420: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
a430: 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20  inity is used.  
a440: 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72      ** if either
a450: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
a460: 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
a470: 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
a480: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27  her.      ** 'x'
a490: 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
a4a0: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
a4b0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
a4c0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
a4d0: 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64        ** is used
a4e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a4f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
a500: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
a510: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
a520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a530: 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
a540: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
a550: 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65   0);.      memse
a560: 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73  t(&keyInfo, 0, s
a570: 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b  izeof(keyInfo));
a580: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e  .      keyInfo.n
a590: 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Field = 1;.     
a5a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a5b0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
a5c0: 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54  lumns, pExpr->iT
a5d0: 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20  able, 1);..     
a5e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
a5f0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
a600: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
a610: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
a620: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
a630: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
a640: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
a650: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
a660: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
a670: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
a680: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
a690: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
a6a0: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
a6b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
a6c0: 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e   iParm = pExpr->
a6d0: 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74  iTable +  (((int
a6e0: 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b  )affinity)<<16);
a6f0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
a700: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t *pEList;.     
a710: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
a720: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
a730: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
a740: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
a750: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
a760: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
a770: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  lect, SRT_Set, i
a780: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Parm, 0, 0, 0, 0
a790: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73  );.        pELis
a7a0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
a7b0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
a7c0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
a7d0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
a7e0: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
a7f0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
a800: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
a810: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
a820: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
a830: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
a840: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
a850: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a860: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
a870: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
a880: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
a890: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
a8a0: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
a8b0: 09 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70  .** For each exp
a8c0: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
a8d0: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
a8e0: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
a8f0: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
a900: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
a910: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
a920: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
a930: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
a940: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
a950: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
a960: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
a970: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
a980: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
a990: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
a9a0: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
a9b0: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
a9c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
a9d0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
a9e0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
a9f0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  ->pList;.       
aa00: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
aa10: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20  _item *pItem;.. 
aa20: 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
aa30: 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
aa40: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
aa50: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
aa60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aa70: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
aa80: 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  [0] = pExpr->pLe
aa90: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  ft->pColl;..    
aaa0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
aab0: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
aac0: 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
aad0: 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  >. */.        fo
aae0: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
aaf0: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
ab00: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
ab10: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
ab20: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
ab30: 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  m->pExpr;..     
ab40: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
ab50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
ab60: 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77   constant then w
ab70: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20  e will need to. 
ab80: 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61           ** disa
ab90: 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61  ble the test tha
aba0: 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  t was generated 
abb0: 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73  above that makes
abc0: 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20   sure.          
abd0: 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c  ** this code onl
abe0: 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e  y executes once.
abf0: 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20    Because for a 
ac00: 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20  non-constant.   
ac10: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73         ** expres
ac20: 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  sion we need to 
ac30: 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20  rerun this code 
ac40: 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20  each time..     
ac50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
ac60: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e 30    if( testAddr>0
ac70: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
ac80: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
ac90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  ){.            V
aca0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 73 71 6c  dbeOp *aOp = sql
acb0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
acc0: 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a 20 20   testAddr-1);.  
acd0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
ace0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
acf0: 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b  (i=0; i<3; i++){
ad00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
ad10: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 3d 20 4f  Op[i].opcode = O
ad20: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
ad30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ad40: 20 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a    testAddr = 0;.
ad50: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
ad60: 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
ad70: 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
ad80: 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
ad90: 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
ada0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
adb0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
adc0: 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20  (pParse, pE2);. 
add0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ade0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
adf0: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
ae00: 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
ae10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ae20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ae30: 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
ae40: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
ae50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ae60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ae70: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
ae80: 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49  r, (void *)&keyI
ae90: 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
aea0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
aeb0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
aec0: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
aed0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
aee0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61        /* This ha
aef0: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
af00: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
af10: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
af20: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
af30: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
af40: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
af50: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
af60: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
af70: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
af80: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a  ell in iColumn..
af90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
afa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65  tatic const Toke
afb0: 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22 2c 20 30  n one = { "1", 0
afc0: 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c  , 1 };.      Sel
afd0: 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20  ect *pSel;.     
afe0: 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 20   int iMem;.     
aff0: 20 69 6e 74 20 73 6f 70 3b 0a 0a 20 20 20 20 20   int sop;..     
b000: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
b010: 3d 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  = iMem = pParse-
b020: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  >nMem++;.      p
b030: 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  Sel = pExpr->pSe
b040: 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
b050: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
b060: 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
b070: 73 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  sop = SRT_Mem;. 
b080: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b090: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
b0a0: 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30 29 3b  mNull, iMem, 0);
b0b0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
b0c0: 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e 69 74  ment((v, "# Init
b0d0: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
b0e0: 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "));.      }else
b0f0: 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20  {.        sop = 
b100: 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
b110: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b120: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
b130: 74 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  t, 0, iMem);.   
b140: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
b150: 28 28 76 2c 20 22 23 20 49 6e 69 74 20 45 58 49  ((v, "# Init EXI
b160: 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  STS result"));. 
b170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b180: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
b190: 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  Sel->pLimit);.  
b1a0: 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74      pSel->pLimit
b1b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
b1c0: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
b1d0: 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71   &one);.      sq
b1e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
b1f0: 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69  se, pSel, sop, i
b200: 4d 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  Mem, 0, 0, 0, 0)
b210: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b220: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
b230: 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20  testAddr ){.    
b240: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b250: 65 72 65 28 76 2c 20 74 65 73 74 41 64 64 72 29  ere(v, testAddr)
b260: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
b270: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b280: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b290: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
b2a0: 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
b2b0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
b2c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
b2d0: 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
b2e0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68   z[0..n-1] on th
b2f0: 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e stack..*/.stat
b300: 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
b310: 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  ger(Vdbe *v, con
b320: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
b330: 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
b340: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
b350: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
b360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b370: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
b380: 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   i, 0);.  }else 
b390: 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
b3a0: 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20  n64Bits(z) ){.  
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
b3c0: 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
b3d0: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c   0, z, n);.  }el
b3e0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
b3f0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  dbeOp3(v, OP_Rea
b400: 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  l, 0, 0, z, n);.
b410: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
b420: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
b430: 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
b440: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
b450: 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
b460: 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74  sion and leave t
b470: 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65  he result on the
b480: 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a   top of stack..*
b490: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
b4a0: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
b4b0: 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
b4c0: 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
b4d0: 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
b4e0: 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
b4f0: 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
b500: 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
b510: 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
b520: 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
b530: 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
b540: 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
b550: 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
b560: 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
b570: 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
b580: 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
b590: 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
b5a0: 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
b5b0: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
b5c0: 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
b5d0: 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
b5e0: 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
b5f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b600: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
b610: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
b620: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
b630: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b640: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 6e 74  .  int op;.  int
b650: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31 3b 20   stackChng = 1; 
b660: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
b670: 63 68 61 6e 67 65 20 74 6f 20 73 74 61 63 6b 20  change to stack 
b680: 64 65 70 74 68 20 2a 2f 0a 0a 20 20 69 66 28 20  depth */..  if( 
b690: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
b6a0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
b6b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b6c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
b6d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  , 0, 0);.    ret
b6e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d 20  urn;.  }.  op = 
b6f0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
b700: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
b710: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
b720: 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
b730: 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
b740: 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
b750: 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
b760: 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
b770: 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
b780: 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
b790: 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
b7a0: 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
b7b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b7c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b7d0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 43 6f 6c 2d 3e  _MemLoad, pCol->
b7e0: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
b7f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b800: 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
b810: 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
b820: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b830: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b840: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49  OP_Column, pAggI
b850: 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 2c  nfo->sortingIdx,
b860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b880: 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
b890: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  mn);.        bre
b8a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b8b0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
b8c0: 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
b8d0: 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
b8e0: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
b8f0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
b900: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
b910: 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
b920: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6f 6e        /* This on
b930: 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
b940: 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63 6f 6e  coding check con
b950: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
b960: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
b970: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3e 30 20 29  se->ckOffset>0 )
b980: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b990: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b9a0: 5f 44 75 70 2c 20 70 50 61 72 73 65 2d 3e 63 6b  _Dup, pParse->ck
b9b0: 4f 66 66 73 65 74 2d 70 45 78 70 72 2d 3e 69 43  Offset-pExpr->iC
b9c0: 6f 6c 75 6d 6e 2d 31 2c 20 31 29 3b 0a 20 20 20  olumn-1, 1);.   
b9d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
b9e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
b9f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ba00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ba10: 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
ba20: 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
ba30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
ba40: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
ba50: 66 61 75 6c 74 28 76 2c 20 70 45 78 70 72 2d 3e  fault(v, pExpr->
ba60: 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f  pTab, pExpr->iCo
ba70: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
ba80: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ba90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
baa0: 4f 50 5f 52 6f 77 69 64 2c 20 70 45 78 70 72 2d  OP_Rowid, pExpr-
bab0: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
bac0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
bad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bae0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
baf0: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
bb00: 28 76 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  (v, pExpr->token
bb10: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
bb20: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
bb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bb40: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
bb50: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
bb60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bb70: 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c  K_FLOAT==OP_Real
bb80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bb90: 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f  ( TK_STRING==OP_
bba0: 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20 20 20  String8 );.     
bbb0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
bbc0: 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  xpr(pExpr);.    
bbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
bbe0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45  (v, op, 0, 0, pE
bbf0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
bc00: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
bc10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
bc30: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
bc40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bc50: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
bc60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bc70: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
bc80: 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
bc90: 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
bca0: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
bcb0: 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
bcc0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
bcd0: 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d  assert( TK_BLOB=
bce0: 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20  =OP_HexBlob );. 
bcf0: 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e       n = pExpr->
bd00: 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20  token.n - 3;.   
bd10: 20 20 20 7a 20 3d 20 70 45 78 70 72 2d 3e 74 6f     z = pExpr->to
bd20: 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20  ken.z + 2;.     
bd30: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
bd40: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
bd50: 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22  ){.        z = "
bd60: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
bd70: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
bd80: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20  v, op, 0, 0, z, 
bd90: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
bda0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
bdb0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
bdc0: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
bdd0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bde0: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
bdf0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
be00: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
be10: 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20  >token.n>1 ){.  
be20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
be30: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
be40: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
be50: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
be60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
be70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
be80: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
be90: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
bea0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
beb0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
bec0: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
bed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bee0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bef0: 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
bf00: 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
bf10: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
bf20: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
bf30: 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
bf40: 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
bf50: 69 6e 74 20 61 66 66 2c 20 6f 70 3b 0a 20 20 20  int aff, op;.   
bf60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
bf70: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
bf80: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
bf90: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
bfa0: 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
bfb0: 2d 3e 74 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20  ->token, 1);.   
bfc0: 20 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29     switch( aff )
bfd0: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  {.        case S
bfe0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
bff0: 52 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 54 6f 49  R:   op = OP_ToI
c000: 6e 74 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  nt;      break;.
c010: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
c020: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a  ITE_AFF_NUMERIC:
c030: 20 20 20 6f 70 20 3d 20 4f 50 5f 54 6f 4e 75 6d     op = OP_ToNum
c040: 65 72 69 63 3b 20 20 62 72 65 61 6b 3b 0a 20 20  eric;  break;.  
c050: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c060: 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20 20  E_AFF_TEXT:     
c070: 20 6f 70 20 3d 20 4f 50 5f 54 6f 54 65 78 74 3b   op = OP_ToText;
c080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c090: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c0a0: 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 6f  AFF_NONE:      o
c0b0: 70 20 3d 20 4f 50 5f 54 6f 42 6c 6f 62 3b 20 20  p = OP_ToBlob;  
c0c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c0d0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
c0e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
c0f0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61  0, 0);.      sta
c100: 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ckChng = 0;.    
c110: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
c120: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c130: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
c140: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
c150: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
c160: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
c170: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
c180: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
c190: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
c1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c1b0: 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
c1c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
c1d0: 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
c1e0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
c1f0: 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
c200: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
c210: 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
c220: 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
c230: 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
c240: 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
c250: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c260: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c270: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
c280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c290: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c2a0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c2b0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
c2c0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c2d0: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
c2e0: 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  ght, op, 0, 0);.
c2f0: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
c300: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
c310: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c320: 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
c330: 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
c340: 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
c350: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
c360: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
c370: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
c380: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
c390: 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
c3a0: 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
c3b0: 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
c3c0: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
c3d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
c3e0: 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
c3f0: 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
c400: 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
c410: 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20  =OP_And );.     
c420: 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
c430: 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  OP_Or );.      a
c440: 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
c450: 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20  OP_Add );.      
c460: 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
c470: 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
c480: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c490: 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
c4a0: 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  der );.      ass
c4b0: 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
c4c0: 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20  OP_BitAnd );.   
c4d0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
c4e0: 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
c4f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c500: 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
c510: 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  de );.      asse
c520: 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
c530: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20  P_ShiftLeft );. 
c540: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c550: 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
c560: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61  Right );.      a
c570: 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
c580: 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20  ==OP_Concat );. 
c590: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c5a0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c5b0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c5c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c5d0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c5e0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
c5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c600: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
c610: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
c620: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
c630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c640: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
c650: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
c660: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
c670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
c680: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
c690: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
c6a0: 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f  LOAT || pLeft->o
c6b0: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
c6c0: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  .        Token *
c6d0: 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  p = &pLeft->toke
c6e0: 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
c6f0: 2a 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  *z = sqliteMallo
c700: 63 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20  c( p->n + 2 );. 
c710: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
c720: 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c  , "-%.*s", p->n,
c730: 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20   p->z);.        
c740: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
c750: 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
c760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c770: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  Op3(v, OP_Real, 
c780: 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  0, 0, z, p->n+1)
c790: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
c7a0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49  .          codeI
c7b0: 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e  nteger(v, z, p->
c7c0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n+1);.        }.
c7d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
c7e0: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62  ee(z);.        b
c7f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c800: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
c810: 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20  ugh into TK_NOT 
c820: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
c830: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
c840: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
c850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c860: 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
c870: 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ot );.      asse
c880: 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
c890: 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ot );.      sqli
c8a0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c8b0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c8c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c8d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
c8e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74   0, 0);.      st
c8f0: 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
c900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c910: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
c920: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
c930: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
c940: 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20   int dest;.     
c950: 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
c960: 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
c970: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c980: 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
c990: 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73  tNull );.      s
c9a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c9b0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
c9c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c9d0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c9e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c9f0: 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20  );.      dest = 
ca00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
ca10: 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20  ntAddr(v) + 2;. 
ca20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ca30: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
ca40: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
ca50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ca60: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
ca70: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
ca80: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
ca90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
caa0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
cab0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
cac0: 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
cad0: 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
cae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
caf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
cb00: 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e 61 46 75  Load, pInfo->aFu
cb10: 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
cb20: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
cb30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cb40: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
cb50: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
cb60: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
cb70: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
cb80: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
cb90: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
cba0: 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
cbb0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
cbc0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
cbd0: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
cbe0: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
cbf0: 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
cc00: 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
cc10: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
cc20: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70        u8 enc = p
cc30: 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
cc40: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
cc50: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
cc60: 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  zId = pExpr->tok
cc70: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
cc80: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
cc90: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
cca0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
ccb0: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
ccc0: 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20  Id, nId, nExpr, 
ccd0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  enc, 0);.      a
cce0: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
ccf0: 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
cd00: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
cd10: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
cd20: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f  pList);.      fo
cd30: 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26  r(i=0; i<nExpr &
cd40: 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20  & i<32; i++){.  
cd50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
cd60: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
cd70: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
cd80: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
cd90: 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c  constMask |= (1<
cda0: 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <i);.        }. 
cdb0: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d         if( pDef-
cdc0: 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20  >needCollSeq && 
cdd0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
cde0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
cdf0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
ce00: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
ce10: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
ce20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ce30: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
ce40: 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
ce50: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
ce60: 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
ce70: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20  >db->pDfltColl; 
ce80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ce90: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
cea0: 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
ceb0: 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
cec0: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
ced0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cee0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63  beOp3(v, OP_Func
cef0: 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  tion, constMask,
cf00: 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70   nExpr, (char*)p
cf10: 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  Def, P3_FUNCDEF)
cf20: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
cf30: 67 20 3d 20 31 2d 6e 45 78 70 72 3b 0a 20 20 20  g = 1-nExpr;.   
cf40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cf50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cf60: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
cf70: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
cf80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
cf90: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
cfa0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
cfb0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  t(pParse, pExpr)
cfc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cfd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
cfe0: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
cff0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
d000: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d010: 2c 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65  , "# load subque
d020: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
d030: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d040: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
d050: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
d060: 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66  r;.      char af
d070: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 73 71  finity;.      sq
d080: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
d090: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
d0a0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  );..      /* Fig
d0b0: 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
d0c0: 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
d0d0: 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
d0e0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
d0f0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70     ** of the exp
d100: 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
d110: 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
d120: 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
d130: 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a  able for.      *
d140: 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P3 of OP_MakeR
d150: 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ecord..      */.
d160: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
d170: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
d180: 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20  ity(pExpr);..   
d190: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d1a0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
d1b0: 72 2c 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20  r, 1, 0);..     
d1c0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78   /* Code the <ex
d1d0: 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
d1e0: 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20   IN (...)". The 
d1f0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
d200: 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e        ** pExpr->
d210: 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  iTable contains 
d220: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
d230: 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e  make up the (...
d240: 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ) set..      */.
d250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d260: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
d270: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
d280: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d290: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d2a0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
d2b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d2c0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
d2d0: 64 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20  ddr+4);         
d2e0: 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a     /* addr + 0 *
d2f0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
d300: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
d310: 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  op, 2, 0);.     
d320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d330: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
d340: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d350: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d360: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b  P_Goto, 0, addr+
d370: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
d380: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
d390: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
d3a0: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20   &affinity, 1); 
d3b0: 20 20 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f    /* addr + 4 */
d3c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d3d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
d3e0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
d3f0: 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20  le, addr+7);.   
d400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d410: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
d420: 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20  , -1, 0);       
d430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
d440: 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20  dr + 6 */..     
d450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
d460: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
d470: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
d480: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
d490: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
d4a0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d4b0: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
d4c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
d4d0: 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
d4e0: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
d4f0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
d500: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d510: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
d520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d530: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
d540: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
d550: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d560: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
d570: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
d580: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
d590: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c  Right, OP_Ge, 0,
d5a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d5b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d5c0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
d5d0: 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
d5e0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
d5f0: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
d600: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d610: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
d620: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
d630: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
d640: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
d650: 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Le, 0, 0);.     
d660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d670: 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20  p(v, OP_And, 0, 
d680: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
d690: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d6a0: 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
d6b0: 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
d6c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d6d0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
d6e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
d6f0: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
d700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d710: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
d720: 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  E: {.      int e
d730: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20  xpr_end_label;. 
d740: 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73       int jumpIns
d750: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
d760: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  pr;.      int i;
d770: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
d780: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  *pEList;.      s
d790: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d7a0: 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a  tem *aListelem;.
d7b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
d7c0: 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
d7d0: 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
d7e0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  ->pList->nExpr %
d7f0: 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
d800: 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
d810: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
d820: 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
d830: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
d840: 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
d850: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
d860: 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
d870: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
d880: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20  xpr_end_label = 
d890: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d8a0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
d8b0: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
d8c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d8d0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d8e0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
d8f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d900: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
d910: 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
d920: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d930: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
d940: 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  lem[i].pExpr);. 
d950: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
d960: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
d970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d980: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
d990: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   1, 1);.        
d9a0: 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64    jumpInst = cod
d9b0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
d9c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61   pExpr->pLeft, a
d9d0: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
d9e0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29      OP_Ne, 0, 1)
da10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
da20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
da30: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
da40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
da50: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
da60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
da70: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
da80: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
da90: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
daa0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
dab0: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
dac0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
dad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dae0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
daf0: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
db00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
db10: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
db20: 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20   jumpInst);.    
db30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
db40: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
db50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
db60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
db70: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
db80: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
db90: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
dba0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
dbb0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
dbc0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
dbd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dbf0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
dc00: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
dc10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
dc20: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
dc30: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
dc40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc50: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
dc60: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
dc70: 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
dc80: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
dc90: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
dca0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dcb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
dcc0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
dcd0: 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
dce0: 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
dcf0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
dd00: 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
dd10: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d  .return;.      }
dd20: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
dd30: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
dd40: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
dd50: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
dd60: 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
dd70: 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
dd80: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
dd90: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
dda0: 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
ddb0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
ddc0: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
ddd0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
dde0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
ddf0: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
de00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
de10: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
de20: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
de30: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  pExpr->iColumn,.
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
de60: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
de70: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
de80: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
de90: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
dea0: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67  iColumn == OE_Ig
deb0: 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20  nore );.        
dec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ded0: 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50  p(v, OP_ContextP
dee0: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
def0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
df00: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
df10: 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67   0, pParse->trig
df20: 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d  Stack->ignoreJum
df30: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62  p);.         Vdb
df40: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
df50: 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29  raise(IGNORE)"))
df60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
df70: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
df80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
df90: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
dfa0: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  if( pParse->ckOf
dfb0: 66 73 65 74 20 29 7b 0a 20 20 20 20 70 50 61 72  fset ){.    pPar
dfc0: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 2b 3d 20  se->ckOffset += 
dfd0: 73 74 61 63 6b 43 68 6e 67 3b 0a 20 20 20 20 61  stackChng;.    a
dfe0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63  ssert( pParse->c
dff0: 6b 4f 66 66 73 65 74 20 29 3b 0a 20 20 7d 0a 7d  kOffset );.  }.}
e000: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e010: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a  _OMIT_TRIGGER./*
e020: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
e030: 65 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20  e that evalutes 
e040: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
e050: 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73 20  sion and leaves 
e060: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e  the result.** on
e070: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65   the stack.  See
e080: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 45 78 70   also sqlite3Exp
e090: 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  rCode()..**.** T
e0a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
e0b0: 74 20 61 6c 73 6f 20 63 61 63 68 65 20 74 68 65  t also cache the
e0c0: 20 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69   result and modi
e0d0: 66 79 20 74 68 65 20 70 45 78 70 72 20 74 72 65  fy the pExpr tre
e0e0: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  e.** so that it 
e0f0: 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66  will make use of
e100: 20 74 68 65 20 63 61 63 68 65 64 20 72 65 73 75   the cached resu
e110: 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  lt on subsequent
e120: 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20   evaluations.** 
e130: 72 61 74 68 65 72 20 74 68 61 6e 20 65 76 61 6c  rather than eval
e140: 75 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20 65  uate the whole e
e150: 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e  xpression again.
e160: 20 20 54 72 69 76 69 61 6c 20 65 78 70 72 65 73    Trivial expres
e170: 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74  sions are.** not
e180: 20 63 61 63 68 65 64 2e 20 20 49 66 20 74 68 65   cached.  If the
e190: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
e1a0: 61 63 68 65 64 2c 20 69 74 73 20 72 65 73 75 6c  ached, its resul
e1b0: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  t is stored in a
e1c0: 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61   .** memory loca
e1d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
e1e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
e1f0: 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
e200: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
e210: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
e220: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
e230: 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20  int iMem;.  int 
e240: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
e250: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
e260: 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  n;.  addr1 = sql
e270: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e280: 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ddr(v);.  sqlite
e290: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e2a0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 61 64 64 72  , pExpr);.  addr
e2b0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
e2c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
e2d0: 20 69 66 28 20 61 64 64 72 32 3e 61 64 64 72 31   if( addr2>addr1
e2e0: 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62  +1 || sqlite3Vdb
e2f0: 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29  eGetOp(v, addr1)
e300: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e  ->opcode==OP_Fun
e310: 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65  ction ){.    iMe
e320: 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  m = pExpr->iTabl
e330: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
e340: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
e350: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
e360: 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30  emStore, iMem, 0
e370: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
e380: 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a   = TK_REGISTER;.
e390: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
e3a0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
e3b0: 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
e3c0: 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
e3d0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
e3e0: 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
e3f0: 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68  ion list onto th
e400: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  e stack..**.** R
e410: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
e420: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73   of elements pus
e430: 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  hed onto the sta
e440: 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
e450: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
e460: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
e470: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
e480: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e490: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e4a0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
e4b0: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
e4c0: 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73   coded */.){.  s
e4d0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e4e0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
e4f0: 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 70 4c  t i, n;.  if( pL
e500: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
e510: 30 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  0;.  n = pList->
e520: 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74  nExpr;.  for(pIt
e530: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e  em=pList->a, i=n
e540: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
e550: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
e560: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e570: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
e580: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
e590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
e5a0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
e5b0: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
e5c0: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
e5d0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
e5e0: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
e5f0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e600: 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
e610: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
e620: 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
e630: 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
e640: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
e650: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
e660: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
e670: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
e680: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
e690: 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
e6a0: 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
e6b0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
e6c0: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
e6d0: 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
e6e0: 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
e6f0: 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
e700: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
e710: 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
e720: 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
e730: 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
e740: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
e750: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
e760: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
e770: 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
e780: 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
e790: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
e7a0: 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
e7b0: 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
e7c0: 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
e7d0: 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
e7e0: 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
e7f0: 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
e800: 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
e810: 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
e820: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
e830: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
e840: 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
e850: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
e860: 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
e870: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
e880: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
e890: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
e8a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66   = 0;.  int ckOf
e8b0: 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63  fset = pParse->c
e8c0: 6b 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76  kOffset;.  if( v
e8d0: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
e8e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d  ) return;.  op =
e8f0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
e900: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
e910: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
e920: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
e930: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e940: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
e950: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
e960: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e970: 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49  Left, d2, !jumpI
e980: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
e990: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
e9a0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e9b0: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
e9c0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
e9d0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e9e0: 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
e9f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ea00: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
ea10: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
ea20: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
ea30: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
ea40: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
ea50: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
ea60: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
ea70: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
ea80: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
ea90: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
eaa0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
eab0: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
eac0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ead0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
eae0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
eaf0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
eb00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eb10: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
eb20: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
eb30: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
eb40: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
eb50: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
eb60: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
eb70: 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
eb80: 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
eb90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
eba0: 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
ebb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
ebc0: 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
ebd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ebe0: 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
ebf0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
ec00: 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
ec10: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
ec20: 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73  OP_Ne );.      s
ec30: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ec40: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ec50: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
ec60: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ec70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
ec80: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
ec90: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
eca0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
ecb0: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
ecc0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
ecd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ece0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ecf0: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
ed00: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
ed10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
ed20: 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
ed30: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
ed40: 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
ed50: 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
ed60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ed70: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
ed80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
ed90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eda0: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
edb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
edc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
edd0: 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
ede0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
edf0: 73 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20  sion "x BETWEEN 
ee00: 79 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c  y AND z" is impl
ee10: 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20  emented as:.    
ee20: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20    **.      ** 1 
ee30: 49 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20  IF (x < y) GOTO 
ee40: 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20  3.      ** 2 IF 
ee50: 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64  (x <= z) GOTO <d
ee60: 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20  est>.      ** 3 
ee70: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
ee80: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
ee90: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
eea0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
eeb0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
eec0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
eed0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
eee0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
eef0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ode(pParse, pLef
ef00: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ef10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ef20: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
ef30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ef40: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
ef50: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
ef60: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
ef70: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
ef80: 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a  ht, OP_Lt, 0, !j
ef90: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20  umpIfNull);..   
efa0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
efb0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
efc0: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
efd0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
efe0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
eff0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
f000: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
f010: 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73  ight, OP_Le, des
f020: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
f030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f040: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
f050: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
f060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
f070: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
f080: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f090: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
f0a0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
f0b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f0c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
f0d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f0e0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
f0f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f100: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f110: 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20  If, jumpIfNull, 
f120: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
f130: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
f140: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
f150: 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a   = ckOffset;.}..
f160: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
f170: 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
f180: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
f190: 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
f1a0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
f1b0: 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
f1c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
f1d0: 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
f1e0: 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
f1f0: 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
f200: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
f210: 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
f220: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
f230: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
f240: 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
f250: 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
f260: 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
f270: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
f280: 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  e or fall throug
f290: 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  h if jumpIfNull 
f2a0: 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69  is false..*/.voi
f2b0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
f2c0: 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
f2d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
f2e0: 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
f2f0: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
f300: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
f310: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
f320: 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66  = 0;.  int ckOff
f330: 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b  set = pParse->ck
f340: 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d  Offset;.  if( v=
f350: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
f360: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
f370: 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
f380: 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
f390: 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
f3a0: 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
f3b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
f3c0: 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
f3d0: 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
f3e0: 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
f3f0: 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
f400: 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
f410: 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
f420: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
f430: 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
f440: 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
f450: 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
f460: 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
f470: 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
f480: 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
f490: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
f4b0: 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
f4c0: 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
f4d0: 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
f4e0: 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
f4f0: 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
f500: 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
f510: 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
f520: 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
f530: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
f540: 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
f550: 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
f560: 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
f570: 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
f580: 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
f590: 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
f5a0: 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
f5b0: 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
f5c0: 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
f5d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
f5e0: 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
f5f0: 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
f600: 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
f610: 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
f620: 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
f630: 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
f640: 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
f650: 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
f660: 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
f670: 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
f680: 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
f690: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f6a0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
f6b0: 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
f6c0: 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
f6d0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
f6e0: 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
f6f0: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
f700: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
f710: 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
f720: 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
f730: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
f740: 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
f750: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
f760: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
f770: 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
f780: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
f790: 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
f7a0: 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
f7b0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
f7c0: 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
f7d0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
f7e0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
f7f0: 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
f800: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
f810: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
f820: 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
f830: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
f840: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
f850: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
f860: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
f870: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
f880: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
f890: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
f8a0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
f8b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f8c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
f8d0: 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
f8e0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
f8f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f900: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
f910: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
f920: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
f930: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
f940: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
f950: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
f960: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
f970: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
f980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f990: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f9a0: 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
f9b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f9c0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
f9d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
f9e0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
f9f0: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
fa00: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
fa10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fa20: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
fa30: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
fa40: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
fa50: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
fa60: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
fa70: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
fa80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
fa90: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
faa0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
fab0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fac0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
fad0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
fae0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
faf0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
fb00: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
fb10: 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75  ht, op, dest, ju
fb20: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
fb30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fb40: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
fb50: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
fb60: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
fb70: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
fb80: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
fb90: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
fba0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fbb0: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
fbc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fbd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
fbe0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
fbf0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
fc00: 69 73 20 22 78 20 42 45 54 57 45 45 4e 20 79 20  is "x BETWEEN y 
fc10: 41 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d  AND z". It is im
fc20: 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20  plemented as:.  
fc30: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
fc40: 31 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f  1 IF (x >= y) GO
fc50: 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
fc60: 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
fc70: 20 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a    ** 3 IF (x > z
fc80: 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20  ) GOTO <dest>.  
fc90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
fca0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70   addr;.      Exp
fcb0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
fcc0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
fcd0: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
fce0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
fcf0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
fd00: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fd10: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
fd20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fd30: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
fd40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
fd50: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
fd60: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
fd70: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
fd80: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fd90: 72 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  r(v);.      code
fda0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
fdb0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
fdc0: 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a  P_Ge, addr+3, !j
fdd0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20  umpIfNull);..   
fde0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fdf0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
fe00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fe10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fe20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
fe30: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  );.      pRight 
fe40: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
fe50: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
fe60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
fe70: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
fe80: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
fe90: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
fea0: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
feb0: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
fec0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
fed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
fee0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
fef0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ff00: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
ff10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff20: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  ddOp(v, OP_IfNot
ff30: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
ff40: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
ff50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
ff60: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d  arse->ckOffset =
ff70: 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a   ckOffset;.}../*
ff80: 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
ff90: 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
ffa0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
ffb0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
ffc0: 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
ffd0: 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
ffe0: 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
fff0: 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
10000 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
10010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10020 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
10030 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
10040 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
10050 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10060 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20   pB==0;.  }else 
10070 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20  if( pB==0 ){.   
10080 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
10090 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
100a0 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >op ) return 0;.
100b0 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
100c0 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
100d0 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
100e0 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
100f0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
10100 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
10110 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e  (pA->pLeft, pB->
10120 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
10130 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
10140 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
10150 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
10160 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ght) ) return 0;
10170 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74  .  if( pA->pList
10180 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
10190 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
101a0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  n 0;.    if( pA-
101b0 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  >pList->nExpr!=p
101c0 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  B->pList->nExpr 
101d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
101e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70  for(i=0; i<pA->p
101f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
10200 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71  ){.      if( !sq
10210 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
10220 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  (pA->pList->a[i]
10230 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73  .pExpr, pB->pLis
10240 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
10250 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
10260 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
10270 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  }.  }else if( pB
10280 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72  ->pList ){.    r
10290 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
102a0 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c  f( pA->pSelect |
102b0 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20  | pB->pSelect ) 
102c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
102d0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
102e0 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43  iTable || pA->iC
102f0 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75  olumn!=pB->iColu
10300 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  mn ) return 0;. 
10310 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a   if( pA->token.z
10320 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
10330 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74  token.z==0 ) ret
10340 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
10350 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e  B->token.n!=pA->
10360 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e  token.n ) return
10370 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
10380 74 65 33 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e  te3StrNICmp(pA->
10390 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b  token.z, pB->tok
103a0 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e  en.z, pB->token.
103b0 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  n)!=0 ) return 0
103c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
103d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
103e0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
103f0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
10400 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
10410 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
10420 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
10430 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
10440 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
10450 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
10460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
10470 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
10480 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
10490 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
104a0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
104b0 63 61 74 65 28 28 76 6f 69 64 2a 2a 29 26 70 49  cate((void**)&pI
104c0 6e 66 6f 2d 3e 61 43 6f 6c 2c 20 73 69 7a 65 6f  nfo->aCol, sizeo
104d0 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
104e0 29 2c 20 33 29 3b 0a 20 20 69 66 28 20 69 3c 30  ), 3);.  if( i<0
104f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
10500 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
10510 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
10520 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
10530 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
10540 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
10550 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
10560 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
10570 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
10580 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
10590 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
105a0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
105b0 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
105c0 6e 63 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  nc(AggInfo *pInf
105d0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  o){.  int i;.  i
105e0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
105f0 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a 2a 29  llocate((void**)
10600 26 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 73  &pInfo->aFunc, s
10610 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75  izeof(pInfo->aFu
10620 6e 63 5b 30 5d 29 2c 20 32 29 3b 0a 20 20 69 66  nc[0]), 2);.  if
10630 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( i<0 ){.    ret
10640 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  urn -1;.  }.  re
10650 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
10660 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
10670 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
10680 70 72 54 72 65 65 28 29 20 75 73 65 64 20 74 6f  prTree() used to
10690 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73   implement .** s
106a0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
106b0 65 41 67 67 72 65 67 61 74 65 73 28 29 2e 20 20  eAggregates().  
106c0 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 41  See sqlite3ExprA
106d0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
106e0 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
106f0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
10700 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10710 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68 65 20  ne analyzes the 
10720 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
10730 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a  on at pExpr..*/.
10740 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
10750 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f 69 64  zeAggregate(void
10760 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45   *pArg, Expr *pE
10770 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
10780 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
10790 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74  C = (NameContext
107a0 20 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65   *)pArg;.  Parse
107b0 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
107c0 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
107d0 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
107e0 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
107f0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
10800 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
10810 3b 0a 20 20 0a 0a 20 20 73 77 69 74 63 68 28 20  ;.  ..  switch( 
10820 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
10830 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
10840 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63   {.      /* Chec
10850 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
10860 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
10870 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
10880 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
10890 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
108a0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
108b0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  y */.      if( p
108c0 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  SrcList ){.     
108d0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
108e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
108f0 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  pSrcList->a;.   
10900 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10910 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
10920 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
10930 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
10940 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
10950 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  l;.          if(
10960 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
10970 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
10980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
10990 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
109a0 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
109b0 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
109c0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
109d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
109e0 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
109f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
10a00 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
10a10 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
10a20 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
10a30 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
10a40 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
10a50 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
10a60 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
10a70 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
10a80 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
10a90 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
10aa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10ab0 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67 49      pCol = pAggI
10ac0 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  nfo->aCol;.     
10ad0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
10ae0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
10af0 75 6d 6e 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  umn; i++, pCol++
10b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
10b10 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c   if( pCol->iTabl
10b20 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
10b30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
10b40 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
10b50 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
10b60 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
10b70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10b80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
10b90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10ba0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
10bb0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
10bc0 20 26 26 20 28 69 20 3d 20 61 64 64 41 67 67 49   && (i = addAggI
10bd0 6e 66 6f 43 6f 6c 75 6d 6e 28 70 41 67 67 49 6e  nfoColumn(pAggIn
10be0 66 6f 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  fo))>=0 ){.     
10bf0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
10c00 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
10c10 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
10c20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d    pCol->iTable =
10c30 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
10c50 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  ol->iColumn = pE
10c60 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
10c70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
10c80 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
10c90 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
10ca0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
10cb0 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  rterColumn = -1;
10cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
10cd0 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  Col->pExpr = pEx
10ce0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
10cf0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
10d00 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
10d10 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
10d20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  j, n;.          
10d30 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
10d40 70 47 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  pGB = pAggInfo->
10d50 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
10d60 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
10d70 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
10d80 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a  pTerm = pGB->a;.
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a  n = pGB->nExpr;.
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=0; j<n; j+
10dd0 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
10df0 78 70 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d  xpr *pE = pTerm-
10e00 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
10e10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
10e20 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
10e30 26 26 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70  && pE->iTable==p
10e40 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
10e70 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
10e80 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
10e90 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
10ea0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a  SorterColumn = j
10eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
10ec0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ef0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
10f00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
10f10 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74   if( pCol->iSort
10f20 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  erColumn<0 ){.  
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
10f40 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
10f50 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53  n = pAggInfo->nS
10f60 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a  ortingColumn++;.
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
10f80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
10f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10fa0 72 65 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74  re is now an ent
10fb0 72 79 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20  ry for pExpr in 
10fc0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
10fd0 20 28 65 69 74 68 65 72 0a 20 20 20 20 20 20 20   (either.       
10fe0 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
10ff0 69 74 20 77 61 73 20 74 68 65 72 65 20 62 65 66  it was there bef
11000 6f 72 65 20 6f 72 20 62 65 63 61 75 73 65 20 77  ore or because w
11010 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 20 69  e just created i
11020 74 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
11030 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70  ** Convert the p
11040 45 78 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f  Expr to be a TK_
11050 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72  AGG_COLUMN refer
11060 72 69 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20  ring to that.   
11070 20 20 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67           ** pAgg
11080 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74  Info->aCol[] ent
11090 72 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
110a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
110b0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
110c0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
110d0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
110e0 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
110f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
11100 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
11110 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11120 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
11130 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
11140 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
11150 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
11160 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
11170 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
11180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
11190 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
111a0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
111b0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  CTION: {.      /
111c0 2a 20 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74  * The pNC->nDept
111d0 68 3d 3d 30 20 74 65 73 74 20 63 61 75 73 65 73  h==0 test causes
111e0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
111f0 69 6f 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69  ions in subqueri
11200 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  es.      ** to b
11210 65 20 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20  e ignored */.   
11220 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70     if( pNC->nDep
11230 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  th==0 ){.       
11240 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11250 20 69 66 20 70 45 78 70 72 20 69 73 20 61 20 64   if pExpr is a d
11260 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
11270 68 65 72 20 61 67 67 72 65 67 61 74 65 20 0a 20  her aggregate . 
11280 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
11290 6f 6e 20 74 68 61 74 20 69 73 20 61 6c 72 65 61  on that is alrea
112a0 64 79 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e  dy in the pAggIn
112b0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
112c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
112d0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
112e0 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67  unc *pItem = pAg
112f0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20  gInfo->aFunc;.  
11300 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11310 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
11320 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
11330 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
11340 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
11350 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
11360 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
11370 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11390 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
113a0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  >=pAggInfo->nFun
113b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
113c0 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69  * pExpr is origi
113d0 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77  nal.  Make a new
113e0 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e   entry in pAggIn
113f0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20  fo->aFunc[].    
11400 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11410 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72     u8 enc = pPar
11420 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
11430 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67         i = addAg
11440 67 49 6e 66 6f 46 75 6e 63 28 70 41 67 67 49 6e  gInfoFunc(pAggIn
11450 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
11460 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
11470 20 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26         pItem = &
11480 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
11490 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
114a0 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
114b0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
114c0 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20    pItem->iMem = 
114d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
114e0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
114f0 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
11500 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
11510 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
11530 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
11540 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20  xpr->token.n,.  
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11560 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20   pExpr->pList ? 
11570 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
11580 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
11590 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
115a0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
115b0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
115d0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
115e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
115f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
11600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
11610 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
11620 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
11630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11640 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
11650 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
11660 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
11670 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
11680 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
11690 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
116a0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
116b0 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  gg = i;.        
116c0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
116d0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
116e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
116f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11700 0a 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c  .  /* Recursivel
11710 79 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65  y walk subquerie
11720 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b  s looking for TK
11730 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68  _COLUMN nodes th
11740 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20  at need.  ** to 
11750 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  be changed to TK
11760 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75  _AGG_COLUMN.  Bu
11770 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70  t increment nDep
11780 74 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  th so that.  ** 
11790 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
117a0 6e 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65 72  nodes in subquer
117b0 69 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68  ies will be unch
117c0 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
117d0 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
117e0 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
117f0 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53  pth++;.    walkS
11800 65 6c 65 63 74 45 78 70 72 28 70 45 78 70 72 2d  electExpr(pExpr-
11810 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a  >pSelect, analyz
11820 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29  eAggregate, pNC)
11830 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74  ;.    pNC->nDept
11840 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  h--;.  }.  retur
11850 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
11860 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20  alyze the given 
11870 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
11880 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
11890 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
118a0 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
118b0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
118c0 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61  added to the pPa
118d0 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
118e0 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74  y..** Make addit
118f0 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f  ional entries to
11900 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
11910 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  g[] array as nec
11920 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
11930 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
11940 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
11950 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
11960 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
11970 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
11980 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
11990 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Names()..**.** I
119a0 66 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65  f errors are see
119b0 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  n, leave an erro
119c0 72 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72  r message in zEr
119d0 72 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a  rMsg and return.
119e0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
119f0 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
11a00 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
11a10 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
11a20 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
11a30 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
11a40 6e 74 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70  nt nErr = pNC->p
11a50 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77  Parse->nErr;.  w
11a60 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
11a70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  r, analyzeAggreg
11a80 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74  ate, pNC);.  ret
11a90 75 72 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  urn pNC->pParse-
11aa0 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a  >nErr - nErr;.}.
11ab0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
11ac0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
11ad0 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
11ae0 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
11af0 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
11b00 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
11b10 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
11b20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
11b30 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
11b40 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
11b50 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
11b60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
11b70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
11b80 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
11b90 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
11ba0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
11bb0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
11bc0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  m;.  int i;.  in
11bd0 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66  t nErr = 0;.  if
11be0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
11bf0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
11c00 61 2c 20 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  a, i=0; nErr==0 
11c10 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
11c20 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
11c30 7b 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20  {.      nErr += 
11c40 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
11c50 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
11c60 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
11c70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11c80 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a              urn nErr;.}.