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

Artifact 14466b227096263213d7748174c2bd8cb722cc3c:


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 34 20 32 30 30 35 2f 31 31 2f 30 33 20  .234 2005/11/03 
0220: 30 32 3a 30 33 3a 31 33 20 64 72 68 20 45 78 70  02:03:13 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 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
9400: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
9420: 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f  lks an expressio
9430: 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c  n tree and resol
9440: 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ves references t
9450: 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d  o.** table colum
9460: 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68  ns.  Nodes of th
9470: 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20  e form ID.ID or 
9480: 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20  ID resolve into 
9490: 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74  an.** index to t
94a0: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
94b0: 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61  table list and a
94c0: 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20   column offset. 
94d0: 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70   The .** Expr.op
94e0: 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f  code for such no
94f0: 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74  des is changed t
9500: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68  o TK_COLUMN.  Th
9510: 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a  e Expr.iTable.**
9520: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
9530: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  d to the index o
9540: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
9550: 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
9560: 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22  st.** plus the "
9570: 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68  base" value.  Th
9580: 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c  e base value wil
9590: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63  l ultimately bec
95a0: 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20  ome the.** VDBE 
95b0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
95c0: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
95d0: 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
95e0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a   the referenced.
95f0: 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45  ** table.  The E
9600: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
9610: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
9620: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
9630: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74   column .** of t
9640: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
9650: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
9660: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72  Column value for
9670: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
9680: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20  ROWID column is 
9690: 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52  -1.  Any INTEGER
96a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
96b0: 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20  umn is tried as 
96c0: 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20  an.** alias for 
96d0: 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  ROWID..**.** Als
96e0: 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69  o resolve functi
96f0: 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65  on names and che
9700: 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  ck the functions
9710: 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75   for proper.** u
9720: 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  sage.  Make sure
9730: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61   all function na
9740: 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a  mes are recogniz
9750: 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74  ed and all funct
9760: 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65  ions.** have the
9770: 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
9780: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c  of arguments.  L
9790: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
97a0: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
97b0: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61  se->zErrMsg if a
97c0: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
97d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
97e0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
97f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
9800: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
9810: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
9820: 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68  ions then set th
9830: 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70  e EP_Agg.** prop
9840: 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72  erty on the expr
9850: 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ession..*/.int s
9860: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
9870: 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43 6f  eNames(.  NameCo
9880: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
9890: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74    /* Namespace t
98a0: 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73  o resolve expres
98b0: 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45  sions in. */.  E
98c0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
98d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
98e0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
98f0: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20  nalyzed. */.){. 
9900: 20 69 6e 74 20 73 61 76 65 64 48 61 73 41 67 67   int savedHasAgg
9910: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
9920: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
9930: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
9940: 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d  ->hasAgg;.  pNC-
9950: 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77  >hasAgg = 0;.  w
9960: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
9970: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
9980: 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28  tep, pNC);.  if(
9990: 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a   pNC->nErr>0 ){.
99a0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
99b0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
99c0: 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ror);.  }.  if( 
99d0: 70 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20  pNC->hasAgg ){. 
99e0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
99f0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67  ty(pExpr, EP_Agg
9a00: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
9a10: 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20 20  avedHasAgg ){.  
9a20: 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20    pNC->hasAgg = 
9a30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
9a40: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9a50: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
9a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69  ;.}../*.** A poi
9a70: 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f 66  nter instance of
9a80: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
9a90: 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73 20  is used to pass 
9aa0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
9ab0: 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72 54  hrough walkExprT
9ac0: 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75 62  ree into codeSub
9ad0: 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a  queryStep()..*/.
9ae0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 51  typedef struct Q
9af0: 75 65 72 79 43 6f 64 65 72 20 51 75 65 72 79 43  ueryCoder QueryC
9b00: 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75 65  oder;.struct Que
9b10: 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72 73  ryCoder {.  Pars
9b20: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
9b30: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
9b40: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d  context */.  Nam
9b50: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20  eContext *pNC;  
9b60: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f    /* Namespace o
9b70: 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e  f first enclosin
9b80: 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a  g query */.};...
9b90: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
9ba0: 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65 72 69  ode for subqueri
9bb0: 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74  es and IN operat
9bc0: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20 6f 70  ors..**.** IN op
9bd0: 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20 69 6e  erators comes in
9be0: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
9bf0: 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72  *           expr
9c00: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 2a   IN (exprlist).*
9c10: 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  * and.**        
9c20: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
9c30: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  CT ...).**.** Th
9c40: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
9c50: 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65 61 74  handled by creat
9c60: 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64 69 6e  ing a set holdin
9c70: 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66  g the list.** of
9c80: 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e   allowed values.
9c90: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
9ca0: 6d 20 63 61 75 73 65 73 20 74 68 65 20 53 45 4c  m causes the SEL
9cb0: 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ECT to generate 
9cc0: 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
9cd0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
9ce0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
9cf0: 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69  BQUERY.void sqli
9d00: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
9d10: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9d20: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
9d30: 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30  int testAddr = 0
9d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d50: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
9d60: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
9d70: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
9d80: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9d90: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
9da0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
9db0: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
9dc0: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
9dd0: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
9de0: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
9df0: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
9e00: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
9e10: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
9e20: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
9e30: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
9e40: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
9e50: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
9e60: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
9e70: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
9e80: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
9e90: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
9ea0: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
9eb0: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
9ec0: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
9ed0: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
9ee0: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
9ef0: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
9f00: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
9f10: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
9f20: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
9f30: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
9f40: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
9f50: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
9f60: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
9f70: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
9f80: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
9f90: 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74  t) && !pParse->t
9fa0: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
9fb0: 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73 65  int mem = pParse
9fc0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71  ->nMem++;.    sq
9fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9fe0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65  , OP_MemLoad, me
9ff0: 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 41  m, 0);.    testA
a000: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
a010: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
a020: 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65   0, 0);.    asse
a030: 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20 7c  rt( testAddr>0 |
a040: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
a050: 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  _failed );.    s
a060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a070: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c  v, OP_MemInt, 1,
a080: 20 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 77   mem);.  }..  sw
a090: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
a0a0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
a0b0: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
a0c0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
a0d0: 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b  KeyInfo keyInfo;
a0e0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
a0f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
a100: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 56 69 72  ss of OP_OpenVir
a110: 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  tual instruction
a120: 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e   */..      affin
a130: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
a140: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
a150: 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  >pLeft);..      
a160: 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
a170: 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
a180: 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
a190: 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
a1a0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
a1b0: 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
a1c0: 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
a1d0: 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
a1e0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
a1f0: 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65  lled with single
a200: 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79  -field index key
a210: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
a220: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
a230: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c   ** from the SEL
a240: 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
a250: 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
a260: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
a270: 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
a280: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
a290: 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
a2a0: 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
a2b0: 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
a2c0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
a2d0: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
a2e0: 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
a2f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
a300: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
a310: 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
a320: 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
a330: 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
a340: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
a350: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
a360: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
a370: 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
a380: 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
a390: 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
a3a0: 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
a3b0: 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
a3c0: 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
a3d0: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
a3e0: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
a3f0: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
a400: 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
a410: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
a420: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
a430: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
a440: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
a450: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
a460: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
a470: 56 69 72 74 75 61 6c 2c 20 70 45 78 70 72 2d 3e  Virtual, pExpr->
a480: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
a490: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e 66    memset(&keyInf
a4a0: 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79  o, 0, sizeof(key
a4b0: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65  Info));.      ke
a4c0: 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31  yInfo.nField = 1
a4d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a4e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
a4f0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45  etNumColumns, pE
a500: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b  xpr->iTable, 1);
a510: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ..      if( pExp
a520: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
a530: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
a540: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
a550: 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
a560: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
a570: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
a580: 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
a590: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
a5a0: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
a5b0: 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
a5c0: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
a5d0: 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
a5e0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a5f0: 20 20 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20      int iParm = 
a600: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20  pExpr->iTable + 
a610: 20 28 28 28 69 6e 74 29 61 66 66 69 6e 69 74 79   (((int)affinity
a620: 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20  )<<16);.        
a630: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
a640: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a650: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
a660: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
a670: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
a680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
a690: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
a6a0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
a6b0: 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _Set, iParm, 0, 
a6c0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
a6d0: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
a6e0: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
a6f0: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
a700: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
a710: 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20  >nExpr>0 ){ .   
a720: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
a730: 43 6f 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79  Coll[0] = binary
a740: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
a750: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a760: 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eft,.           
a770: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e     pEList->a[0].
a780: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
a790: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
a7a0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
a7b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
a7c0: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
a7d0: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
a7e0: 20 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65      **..** For e
a7f0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
a800: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
a810: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
a820: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
a830: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
a840: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
a850: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
a860: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
a870: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
a880: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
a890: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
a8a0: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
a8b0: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
a8c0: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
a8d0: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
a8e0: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
a8f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a900: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
a910: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
a920: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
a930: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
a940: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
a950: 74 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  tem;..        if
a960: 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
a970: 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
a980: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
a990: 55 4d 45 52 49 43 3b 0a 20 20 20 20 20 20 20 20  UMERIC;.        
a9a0: 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66  }.        keyInf
a9b0: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78  o.aColl[0] = pEx
a9c0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
a9d0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;..        /* Lo
a9e0: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
a9f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
aa00: 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
aa10: 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74       for(i=pList
aa20: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
aa30: 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  List->a; i>0; i-
aa40: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
aa50: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32         Expr *pE2
aa60: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
aa70: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
aa80: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
aa90: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
aaa0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
aab0: 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
aac0: 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
aad0: 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
aae0: 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
aaf0: 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
ab00: 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
ab10: 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
ab20: 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
ab30: 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
ab40: 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
ab50: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
ab60: 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
ab70: 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
ab80: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
ab90: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73           if( tes
aba0: 74 41 64 64 72 3e 30 20 26 26 20 21 73 71 6c 69  tAddr>0 && !sqli
abb0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
abc0: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
abd0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61 4f        VdbeOp *aO
abe0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
abf0: 65 74 4f 70 28 76 2c 20 74 65 73 74 41 64 64 72  etOp(v, testAddr
ac00: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1);.           
ac10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
ac20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33      for(i=0; i<3
ac30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
ac40: 20 20 20 20 20 20 61 4f 70 5b 69 5d 2e 6f 70 63        aOp[i].opc
ac50: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
ac60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ac70: 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64           testAdd
ac80: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  r = 0;.         
ac90: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
aca0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
acb0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
acc0: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
acd0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
ace0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
acf0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ad00: 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pE2);.          
ad10: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
ad20: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ad30: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
ad40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
ad50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ad60: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
ad70: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
ad80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
ad90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ada0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
adb0: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
adc0: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)&keyInfo, P3_K
add0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62  EYINFO);.      b
ade0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
adf0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
ae00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
ae10: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
ae20: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
ae30: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
ae40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ae50: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
ae60: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
ae70: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
ae80: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
ae90: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
aea0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
aeb0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
aec0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
aed0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
aee0: 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b  st Token one = {
aef0: 20 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20   "1", 0, 1 };.  
af00: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
af10: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d  ;.      int iMem
af20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 6f 70 3b  ;.      int sop;
af30: 0a 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ..      pExpr->i
af40: 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d 20 3d 20  Column = iMem = 
af50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
af60: 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
af70: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
af80: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
af90: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
afa0: 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54         sop = SRT
afb0: 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  _Mem;.        sq
afc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
afd0: 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 69 4d  , OP_MemNull, iM
afe0: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
aff0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b000: 22 23 20 49 6e 69 74 20 73 75 62 71 75 65 72 79  "# Init subquery
b010: 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
b020: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b030: 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69 73 74   sop = SRT_Exist
b040: 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
b050: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b060: 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 4d 65  P_MemInt, 0, iMe
b070: 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
b080: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 49  Comment((v, "# I
b090: 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
b0a0: 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
b0b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
b0c0: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d  elete(pSel->pLim
b0d0: 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  it);.      pSel-
b0e0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
b0f0: 33 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 45 52  3Expr(TK_INTEGER
b100: 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20  , 0, 0, &one);. 
b110: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
b120: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
b130: 20 73 6f 70 2c 20 69 4d 65 6d 2c 20 30 2c 20 30   sop, iMem, 0, 0
b140: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
b150: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
b160: 0a 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20  .  if( testAddr 
b170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b180: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65  beJumpHere(v, te
b190: 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 72  stAddr);.  }.  r
b1a0: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
b1b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
b1c0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
b1d0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
b1e0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
b1f0: 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
b200: 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
b210: 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
b220: 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  ] on the stack..
b230: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
b240: 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20  odeInteger(Vdbe 
b250: 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
b260: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
b270: 20 69 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   i;.  if( sqlite
b280: 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29  3GetInt32(z, &i)
b290: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b2a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b2b0: 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
b2c0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
b2d0: 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a  e3FitsIn64Bits(z
b2e0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b2f0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  VdbeOp3(v, OP_In
b300: 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29  t64, 0, 0, z, n)
b310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
b320: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
b330: 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20   OP_Real, 0, 0, 
b340: 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  z, n);.  }.}../*
b350: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
b360: 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
b370: 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
b380: 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
b390: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
b3a0: 6c 65 61 76 65 20 74 68 65 20 72 65 73 75 6c 74  leave the result
b3b0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73   on the top of s
b3c0: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
b3d0: 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
b3e0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
b3f0: 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
b400: 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
b410: 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
b420: 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
b430: 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
b440: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
b450: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
b460: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
b470: 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
b480: 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
b490: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
b4a0: 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
b4b0: 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
b4c0: 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
b4d0: 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
b4e0: 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
b4f0: 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
b500: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
b510: 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
b520: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
b530: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b540: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
b550: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
b560: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
b570: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
b580: 3b 0a 20 20 69 6e 74 20 73 74 61 63 6b 43 68 6e  ;.  int stackChn
b590: 67 20 3d 20 31 3b 20 20 20 20 2f 2a 20 41 6d 6f  g = 1;    /* Amo
b5a0: 75 6e 74 20 6f 66 20 63 68 61 6e 67 65 20 74 6f  unt of change to
b5b0: 20 73 74 61 63 6b 20 64 65 70 74 68 20 2a 2f 0a   stack depth */.
b5c0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
b5d0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
b5e0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
b5f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b600: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
b610: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b620: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
b630: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
b640: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
b650: 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  G_COLUMN: {.    
b660: 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49    AggInfo *pAggI
b670: 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
b680: 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72  gInfo;.      str
b690: 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
b6a0: 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66  *pCol = &pAggInf
b6b0: 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  o->aCol[pExpr->i
b6c0: 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Agg];.      if( 
b6d0: 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63  !pAggInfo->direc
b6e0: 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  tMode ){.       
b6f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b700: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
b710: 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b   pCol->iMem, 0);
b720: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b730: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b740: 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
b750: 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
b760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b770: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
b780: 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74  , pAggInfo->sort
b790: 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
b7c0: 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  terColumn);.    
b7d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b7e0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
b7f0: 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
b800: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
b810: 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
b820: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
b830: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
b840: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
b850: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
b860: 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
b870: 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
b880: 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
b890: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
b8a0: 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  t( pParse->ckOff
b8b0: 73 65 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  set>0 );.       
b8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b8d0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 70 50 61  p(v, OP_Dup, pPa
b8e0: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 2d 70 45  rse->ckOffset-pE
b8f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c 20  xpr->iColumn-1, 
b900: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
b910: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
b920: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn>=0 ){.       
b930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b940: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
b950: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
b960: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
b970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
b980: 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20  olumnDefault(v, 
b990: 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70 45 78  pExpr->pTab, pEx
b9a0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
b9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b9c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b9d0: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  dOp(v, OP_Rowid,
b9e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
b9f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ba00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ba10: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
ba20: 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65  ER: {.      code
ba30: 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78 70 72  Integer(v, pExpr
ba40: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
ba50: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
ba60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ba70: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
ba80: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
ba90: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
baa0: 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d  sert( TK_FLOAT==
bab0: 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  OP_Real );.     
bac0: 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54 52 49   assert( TK_STRI
bad0: 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20 29  NG==OP_String8 )
bae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
baf0: 65 71 75 6f 74 65 45 78 70 72 28 70 45 78 70 72  equoteExpr(pExpr
bb00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bb10: 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30  VdbeOp3(v, op, 0
bb20: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  , 0, pExpr->toke
bb30: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
bb40: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
bb50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
bb60: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
bb70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bb80: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
bb90: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
bba0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
bbb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
bbc0: 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
bbd0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
bbe0: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
bbf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
bc00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bc10: 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c  K_BLOB==OP_HexBl
bc20: 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  ob );.      n = 
bc30: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d  pExpr->token.n -
bc40: 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 70 45   3;.      z = pE
bc50: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32  xpr->token.z + 2
bc60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bc70: 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=0 );.      if
bc80: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
bc90: 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20    z = "";.      
bca0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
bcb0: 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c  dbeOp3(v, op, 0,
bcc0: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20   0, z, n);.     
bcd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
bce0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
bcf0: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
bd00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bd10: 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  dOp(v, OP_Variab
bd20: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  le, pExpr->iTabl
bd30: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
bd40: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e   pExpr->token.n>
bd50: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
bd60: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
bd70: 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74  (v, -1, pExpr->t
bd80: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
bd90: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
bda0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bdb0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bdc0: 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
bdd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bde0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
bdf0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
be00: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
be10: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
be20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
be30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
be40: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
be50: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
be60: 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
be70: 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
be80: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
be90: 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
bea0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
beb0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
bec0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c  .      aff = sql
bed0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
bee0: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20  (&pExpr->token, 
bef0: 31 29 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  1);.      switch
bf00: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ( aff ){.       
bf10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
bf20: 5f 49 4e 54 45 47 45 52 3a 20 20 20 6f 70 20 3d  _INTEGER:   op =
bf30: 20 4f 50 5f 54 6f 49 6e 74 3b 20 20 20 20 20 20   OP_ToInt;      
bf40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
bf50: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
bf60: 55 4d 45 52 49 43 3a 20 20 20 6f 70 20 3d 20 4f  UMERIC:   op = O
bf70: 50 5f 54 6f 4e 75 6d 65 72 69 63 3b 20 20 62 72  P_ToNumeric;  br
bf80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
bf90: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
bfa0: 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  T:      op = OP_
bfb0: 54 6f 54 65 78 74 3b 20 20 20 20 20 62 72 65 61  ToText;     brea
bfc0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
bfd0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
bfe0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 54 6f        op = OP_To
bff0: 42 6c 6f 62 3b 20 20 20 20 20 62 72 65 61 6b 3b  Blob;     break;
c000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c020: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
c030: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
c040: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
c050: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
c060: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
c070: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
c080: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
c090: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
c0a0: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
c0b0: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
c0c0: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
c0d0: 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
c0e0: 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
c0f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c100: 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
c110: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c120: 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
c130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c140: 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
c150: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
c160: 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
c170: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
c180: 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
c190: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c1a0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c1b0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
c1c0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c1d0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
c1e0: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
c1f0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
c200: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
c210: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20  pr->pRight, op, 
c220: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61  0, 0);.      sta
c230: 63 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20  ckChng = -1;.   
c240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c250: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
c260: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
c270: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
c280: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
c290: 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
c2a0: 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
c2b0: 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
c2c0: 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
c2d0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
c2e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
c2f0: 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
c300: 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
c310: 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
c320: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
c330: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
c340: 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
c350: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c360: 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a  TK_OR==OP_Or );.
c370: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c380: 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b  _PLUS==OP_Add );
c390: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c3a0: 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74  K_MINUS==OP_Subt
c3b0: 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ract );.      as
c3c0: 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50  sert( TK_REM==OP
c3d0: 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20  _Remainder );.  
c3e0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
c3f0: 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
c400: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c410: 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
c420: 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  itOr );.      as
c430: 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d  sert( TK_SLASH==
c440: 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20  OP_Divide );.   
c450: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53     assert( TK_LS
c460: 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  HIFT==OP_ShiftLe
c470: 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ft );.      asse
c480: 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
c490: 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a  P_ShiftRight );.
c4a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c4b0: 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
c4c0: 61 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  at );.      sqli
c4d0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c4e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c4f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c500: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c510: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
c520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c530: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
c540: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
c550: 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20  kChng = -1;.    
c560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c570: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
c580: 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
c590: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
c5a0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
c5b0: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
c5c0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
c5d0: 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70  p==TK_FLOAT || p
c5e0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
c5f0: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
c600: 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66  Token *p = &pLef
c610: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
c620: 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
c630: 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20 2b  teMalloc( p->n +
c640: 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 70   2 );.        sp
c650: 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73 22  rintf(z, "-%.*s"
c660: 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20  , p->n, p->z);. 
c670: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
c680: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
c690: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
c6a0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
c6b0: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
c6c0: 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  p->n+1);.       
c6d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c6e0: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
c6f0: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
c700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
c710: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
c720: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c730: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
c740: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
c750: 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a  TK_NOT */.    }.
c760: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
c770: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
c780: 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
c790: 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
c7a0: 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20  OP_BitNot );.   
c7b0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
c7c0: 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20  T==OP_Not );.   
c7d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c7e0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
c7f0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c810: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
c820: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
c830: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
c840: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c850: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
c860: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
c870: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
c880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c890: 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
c8a0: 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
c8b0: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
c8c0: 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
c8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c8e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
c8f0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
c900: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c910: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
c920: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c930: 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  dest = sqlite3Vd
c940: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
c950: 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 2;.      sqli
c960: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c970: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
c980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c990: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
c9a0: 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
c9b0: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a   stackChng = 0;.
c9c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c9d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
c9e0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
c9f0: 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
ca00: 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
ca10: 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c  gInfo;.      sql
ca20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ca30: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 49 6e   OP_MemLoad, pIn
ca40: 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
ca50: 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30 29 3b  >iAgg].iMem, 0);
ca60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ca70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ca80: 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20  CONST_FUNC:.    
ca90: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
caa0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
cab0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
cac0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
cad0: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  int nExpr = pLis
cae0: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
caf0: 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63   : 0;.      Func
cb00: 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
cb10: 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20   int nId;.      
cb20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
cb30: 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
cb40: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mask = 0;.      
cb50: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20  int i;.      u8 
cb60: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
cb70: 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c  ->enc;.      Col
cb80: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
cb90: 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
cba0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
cbb0: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
cbc0: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
cbd0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
cbe0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
cbf0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
cc00: 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a  nExpr, enc, 0);.
cc10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
cc20: 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ef!=0 );.      n
cc30: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
cc40: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
cc50: 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
cc60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cc70: 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69  nExpr && i<32; i
cc80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
cc90: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
cca0: 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b  nstant(pList->a[
ccb0: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
ccc0: 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
ccd0: 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
cce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
ccf0: 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
cd00: 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  Seq && !pColl ){
cd10: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
cd20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
cd30: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
cd40: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
cd50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cd60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
cd70: 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
cd80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
cd90: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
cda0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
cdb0: 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
cdc0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
cdd0: 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
cde0: 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
cdf0: 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P3_COLLSEQ);.
ce00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
ce10: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
ce20: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e  OP_Function, con
ce30: 73 74 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28  stMask, nExpr, (
ce40: 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46  char*)pDef, P3_F
ce50: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
ce60: 74 61 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78  tackChng = 1-nEx
ce70: 70 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  pr;.      break;
ce80: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
ce90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
cea0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
ceb0: 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
cec0: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
ced0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
cee0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
cef0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
cf00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cf10: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
cf20: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
cf30: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
cf40: 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61 64  ment((v, "# load
cf50: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
cf60: 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  "));.      break
cf70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
cf80: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
cf90: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
cfa0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
cfb0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
cfc0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
cfd0: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
cfe0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
cff0: 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  he affinity to u
d000: 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b  se to create a k
d010: 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  ey from the resu
d020: 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lts.      ** of 
d030: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
d040: 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72  affinityStr stor
d050: 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  es a static stri
d060: 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a  ng suitable for.
d070: 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f        ** P3 of O
d080: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
d090: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66      */.      aff
d0a0: 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73  inity = comparis
d0b0: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
d0c0: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
d0d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d0e0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b  _Integer, 1, 0);
d0f0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d100: 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
d110: 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
d120: 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ". The temporary
d130: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
d140: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f  pExpr->iTable co
d150: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
d160: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
d170: 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20  he (...) set..  
d180: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
d190: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d1a0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
d1b0: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
d1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d1d0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d1e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d1f0: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
d200: 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20  , -1, addr+4);  
d210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64            /* add
d220: 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73  r + 0 */.      s
d230: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d240: 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29  v, OP_Pop, 2, 0)
d250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d260: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d270: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
d280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d290: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
d2a0: 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20  , addr+7);.     
d2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
d2c0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
d2d0: 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
d2e0: 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72  y, 1);   /* addr
d2f0: 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71   + 4 */.      sq
d300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d310: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
d320: 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b  r->iTable, addr+
d330: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
d340: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d350: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f    /* addr + 6 */
d380: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
d390: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d3a0: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
d3b0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
d3c0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
d3d0: 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
d3e0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
d3f0: 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
d400: 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  >pList->a;.     
d410: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
d420: 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
d430: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d440: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
d450: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
d460: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d470: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
d480: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d490: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
d4a0: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
d4b0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
d4c0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
d4d0: 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  _Ge, 0, 0);.    
d4e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d4f0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
d500: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  , 0);.      pLIt
d510: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
d520: 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
d530: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
d540: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d550: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
d560: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
d570: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
d580: 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29  ht, OP_Le, 0, 0)
d590: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d5a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
d5b0: 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  nd, 0, 0);.     
d5c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d5d0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
d5e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
d5f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
d600: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d610: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
d620: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
d630: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
d640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d650: 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
d660: 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c    int expr_end_l
d670: 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  abel;.      int 
d680: 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20  jumpInst;.      
d690: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
d6a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78   int i;.      Ex
d6b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
d6c0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
d6d0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
d6e0: 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73  telem;..      as
d6f0: 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
d700: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
d710: 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ((pExpr->pList->
d720: 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29  nExpr % 2) == 0)
d730: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
d740: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
d750: 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
d760: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
d770: 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
d780: 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
d790: 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
d7a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
d7b0: 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c        expr_end_l
d7c0: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
d7d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
d7e0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
d7f0: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
d800: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d810: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
d820: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
d830: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
d840: 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
d850: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d860: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d870: 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
d880: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
d890: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
d8a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d8b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d8c0: 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20  OP_Dup, 1, 1);. 
d8d0: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
d8e0: 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  t = codeCompare(
d8f0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d900: 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  Left, aListelem[
d910: 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20  i].pExpr,.      
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
d940: 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 0, 1);.       
d950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d960: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
d970: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
d980: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
d990: 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65  umpInst = sqlite
d9a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d9b0: 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  _IfNot, 1, 0);. 
d9c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d9d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d9e0: 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
d9f0: 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a  em[i+1].pExpr);.
da00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
da10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
da20: 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64  oto, 0, expr_end
da30: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  _label);.       
da40: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
da50: 48 65 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74  Here(v, jumpInst
da60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
da70: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
da80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
da90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
daa0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
dab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dac0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
dad0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dae0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
daf0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
db00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
db10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
db20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
db30: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
db40: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
db50: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
db60: 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  l(v, expr_end_la
db70: 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
db80: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
db90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
dba0: 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
dbb0: 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
dbc0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
dbd0: 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
dbe0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
dbf0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
dc20: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
dc30: 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
dc40: 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a  ram");..return;.
dc50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dc60: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
dc70: 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  !=OE_Ignore ){. 
dc80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
dc90: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
dca0: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20  OE_Rollback ||. 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
dcd0: 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20  = OE_Abort ||.  
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
dcf0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
dd00: 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20   OE_Fail );.    
dd10: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
dd20: 6f 74 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a  oteExpr(pExpr);.
dd30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dd40: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61  VdbeOp3(v, OP_Ha
dd50: 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
dd60: 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43  RAINT, pExpr->iC
dd70: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
dd90: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
dda0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
ddb0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
ddc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ddd0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
dde0: 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
ddf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
de00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
de10: 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
de20: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
de30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
de40: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
de50: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
de60: 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20  noreJump);.     
de70: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
de80: 28 76 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e  (v, "# raise(IGN
de90: 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
dea0: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
deb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
dec0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
ded0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
dee0: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20  e->ckOffset ){. 
def0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66     pParse->ckOff
df00: 73 65 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67  set += stackChng
df10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
df20: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29  arse->ckOffset )
df30: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
df40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
df50: 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  GGER./*.** Gener
df60: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
df70: 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
df80: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
df90: 6c 65 61 76 65 73 20 74 68 65 20 72 65 73 75 6c  leaves the resul
dfa0: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  t.** on the stac
dfb0: 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  k.  See also sql
dfc0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a  ite3ExprCode()..
dfd0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
dfe0: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61  ne might also ca
dff0: 63 68 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  che the result a
e000: 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45  nd modify the pE
e010: 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74  xpr tree.** so t
e020: 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65  hat it will make
e030: 20 75 73 65 20 6f 66 20 74 68 65 20 63 61 63 68   use of the cach
e040: 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  ed result on sub
e050: 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69  sequent evaluati
e060: 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ons.** rather th
e070: 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  an evaluate the 
e080: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
e090: 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c   again.  Trivial
e0a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
e0b0: 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20  .** not cached. 
e0c0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
e0d0: 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20 69 74  on is cached, it
e0e0: 73 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  s result is stor
e0f0: 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f  ed in a .** memo
e100: 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  ry location..*/.
e110: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e120: 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
e130: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
e140: 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65   *pExpr){.  Vdbe
e150: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
e160: 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
e170: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
e180: 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dr2;.  if( v==0 
e190: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72  ) return;.  addr
e1a0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
e1b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
e1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e1d0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
e1e0: 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74  .  addr2 = sqlit
e1f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e200: 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72  r(v);.  if( addr
e210: 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c  2>addr1+1 || sql
e220: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
e230: 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d   addr1)->opcode=
e240: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a  =OP_Function ){.
e250: 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72      iMem = pExpr
e260: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
e270: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
e280: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e290: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
e2a0: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45  iMem, 0);.    pE
e2b0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
e2c0: 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ISTER;.  }.}.#en
e2d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
e2e0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
e2f0: 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
e300: 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
e310: 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
e320: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e330: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
e340: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
e350: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
e360: 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
e370: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
e380: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
e390: 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
e3a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e3b0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
e3c0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
e3d0: 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68   *pList    /* Th
e3e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e3f0: 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
e400: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
e410: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e420: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
e430: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e440: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
e450: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
e460: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
e470: 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d  >a, i=n; i>0; i-
e480: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
e490: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e4a0: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
e4b0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
e4c0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
e4d0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
e4e0: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
e4f0: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
e500: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
e510: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
e520: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
e530: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
e540: 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
e550: 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
e560: 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
e570: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e580: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
e590: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
e5a0: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
e5b0: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
e5c0: 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
e5d0: 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
e5e0: 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
e5f0: 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e  ll flag is true.
e600: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
e610: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
e620: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
e630: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
e640: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
e650: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
e660: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
e670: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
e680: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
e690: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
e6a0: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
e6b0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
e6c0: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
e6d0: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
e6e0: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
e6f0: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
e700: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
e710: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
e720: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
e730: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
e740: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
e750: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
e760: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
e770: 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
e780: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
e790: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
e7a0: 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
e7b0: 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
e7c0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
e7d0: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
e7e0: 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50  nt ckOffset = pP
e7f0: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a  arse->ckOffset;.
e800: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
e810: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
e820: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
e830: 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
e840: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
e850: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
e860: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
e870: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e880: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
e890: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
e8a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
e8b0: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20   !jumpIfNull);. 
e8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e8d0: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
e8e0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
e8f0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
e900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e910: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
e920: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
e930: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e940: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
e950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
e960: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
e970: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
e980: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
e990: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
e9a0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
e9b0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
e9c0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
e9d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e9e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
e9f0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
ea00: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
ea10: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ea20: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
ea30: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
ea40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ea50: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
ea60: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
ea70: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
ea80: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
ea90: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
eaa0: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
eab0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
eac0: 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
ead0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
eae0: 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
eaf0: 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
eb00: 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
eb10: 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
eb20: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
eb30: 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
eb40: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
eb50: 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
eb60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
eb70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
eb80: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
eb90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
eba0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
ebb0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
ebc0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
ebd0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
ebe0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
ebf0: 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
ec00: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
ec10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ec20: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
ec30: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
ec40: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
ec50: 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
ec60: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
ec70: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
ec80: 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
ec90: 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
eca0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ecb0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
ecc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ecd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
ece0: 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
ecf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ed00: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
ed10: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
ed20: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42   expression "x B
ed30: 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20  ETWEEN y AND z" 
ed40: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
ed50: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
ed60: 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79    ** 1 IF (x < y
ed70: 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
ed80: 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20  * 2 IF (x <= z) 
ed90: 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
eda0: 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20    ** 3 ....     
edb0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
edc0: 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  dr;.      Expr *
edd0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
ede0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
edf0: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
ee00: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
ee10: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
ee20: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ee30: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
ee40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee50: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
ee60: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ee70: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ee80: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
ee90: 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70   addr = codeComp
eea0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
eeb0: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74  t, pRight, OP_Lt
eec0: 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  , 0, !jumpIfNull
eed0: 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74  );..      pRight
eee0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
eef0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
ef00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ef10: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
ef20: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
ef30: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
ef40: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
ef50: 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  Le, dest, jumpIf
ef60: 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71  Null);..      sq
ef70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ef80: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
ef90: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
efa0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
efb0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73  , addr);.      s
efc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
efd0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
efe0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eff0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f000: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f010: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f020: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
f030: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f040: 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49  (v, OP_If, jumpI
f050: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
f060: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f070: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63  .  }.  pParse->c
f080: 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73  kOffset = ckOffs
f090: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
f0a0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
f0b0: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
f0c0: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
f0d0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
f0e0: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
f0f0: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
f100: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
f110: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
f120: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
f130: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
f140: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
f150: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
f160: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
f170: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
f180: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
f190: 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
f1a0: 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
f1b0: 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c   is true or fall
f1c0: 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
f1d0: 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e  IfNull is false.
f1e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f1f0: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
f200: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
f210: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
f220: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
f230: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f240: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f250: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
f260: 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61  t ckOffset = pPa
f270: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20  rse->ckOffset;. 
f280: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
f290: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
f2a0: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
f2b0: 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
f2c0: 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
f2d0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
f2e0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
f2f0: 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
f300: 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
f310: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
f320: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
f330: 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
f340: 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
f350: 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
f360: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
f370: 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
f380: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
f390: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
f3a0: 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
f3b0: 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
f3c0: 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
f3d0: 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
f3e0: 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
f3f0: 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
f400: 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
f410: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
f420: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
f430: 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
f440: 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
f450: 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
f460: 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
f470: 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
f480: 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
f490: 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
f4a0: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
f4b0: 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
f4c0: 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
f4d0: 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
f4e0: 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
f4f0: 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
f500: 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
f510: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
f520: 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
f530: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
f540: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
f550: 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
f560: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
f570: 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
f580: 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
f590: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
f5a0: 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
f5b0: 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
f5c0: 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
f5d0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f5e0: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
f5f0: 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
f600: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
f610: 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
f620: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
f630: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
f640: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
f650: 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
f660: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
f670: 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
f680: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
f690: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
f6a0: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
f6b0: 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
f6c0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
f6d0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
f6e0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
f6f0: 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
f700: 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
f710: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
f720: 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
f730: 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
f740: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
f750: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
f760: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f770: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
f780: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
f790: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
f7a0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
f7b0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
f7c0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
f7d0: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
f7e0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
f7f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f800: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
f810: 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
f820: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f830: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
f840: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
f850: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f860: 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
f870: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
f880: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
f890: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
f8a0: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
f8b0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
f8c0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f8d0: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
f8e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f8f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
f900: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f910: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
f920: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
f930: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
f940: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
f950: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f960: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
f970: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
f980: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
f990: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
f9a0: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
f9b0: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
f9c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f9d0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
f9e0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
f9f0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
fa00: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
fa10: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
fa20: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
fa30: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
fa40: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
fa50: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
fa60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fa70: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fa80: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
fa90: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
faa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fab0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
fac0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
fad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fae0: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
faf0: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
fb00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
fb10: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
fb20: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
fb30: 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54  ession is "x BET
fb40: 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49  WEEN y AND z". I
fb50: 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  t is implemented
fb60: 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
fb70: 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e      ** 1 IF (x >
fb80: 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  = y) GOTO 3.    
fb90: 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73    ** 2 GOTO <des
fba0: 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46  t>.      ** 3 IF
fbb0: 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64   (x > z) GOTO <d
fbc0: 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  est>.      */.  
fbd0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
fbe0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
fbf0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
fc00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
fc10: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
fc20: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
fc30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fc40: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
fc50: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
fc60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fc70: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
fc80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fc90: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
fca0: 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ht);.      addr 
fcb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
fcc0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
fcd0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
fce0: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
fcf0: 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64  ight, OP_Ge, add
fd00: 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  r+3, !jumpIfNull
fd10: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
fd20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fd30: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
fd40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fd50: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
fd60: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
fd70: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
fd80: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
fd90: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
fda0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fdb0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
fdc0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
fdd0: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
fde0: 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20  t, OP_Gt, dest, 
fdf0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
fe00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fe10: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
fe20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fe30: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
fe40: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
fe50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fe60: 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e  P_IfNot, jumpIfN
fe70: 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
fe80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fe90: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f   }.  pParse->ckO
fea0: 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74  ffset = ckOffset
feb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
fec0: 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
fed0: 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
fee0: 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
fef0: 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
ff00: 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20  .** if they are 
ff10: 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65  identical and re
ff20: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
ff30: 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
ff40: 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   way..*/.int sql
ff50: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
ff60: 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
ff70: 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
ff80: 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20  if( pA==0 ){.   
ff90: 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20   return pB==0;. 
ffa0: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30   }else if( pB==0
ffb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ffc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
ffd0: 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74  op!=pB->op ) ret
ffe0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
fff0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
10000 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
10010 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
10020 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
10030 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
10040 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
10050 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20  t, pB->pLeft) ) 
10060 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10070 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
10080 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
10090 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65  pB->pRight) ) re
100a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
100b0 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ->pList ){.    i
100c0 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pB->pList==0 
100d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
100e0 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  if( pA->pList->n
100f0 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d  Expr!=pB->pList-
10100 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
10110 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
10120 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  i<pA->pList->nEx
10130 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
10140 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
10150 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73  Compare(pA->pLis
10160 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
10170 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  B->pList->a[i].p
10180 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
10190 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
101a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
101b0 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29   if( pB->pList )
101c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
101d0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53    }.  if( pA->pS
101e0 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65  elect || pB->pSe
101f0 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
10200 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c  .  if( pA->iTabl
10210 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c  e!=pB->iTable ||
10220 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
10230 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
10240 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
10250 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69  token.z ){.    i
10260 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  f( pB->token.z==
10270 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10280 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
10290 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29  n!=pA->token.n )
102a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
102b0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
102c0 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  mp(pA->token.z, 
102d0 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d  pB->token.z, pB-
102e0 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72  >token.n)!=0 ) r
102f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
10300 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 1;.}.../*.
10310 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
10320 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
10330 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
10340 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
10350 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
10360 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
10370 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
10380 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
10390 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
103a0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
103b0 43 6f 6c 75 6d 6e 28 41 67 67 49 6e 66 6f 20 2a  Column(AggInfo *
103c0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
103d0 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72  .  i = sqlite3Ar
103e0 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69  rayAllocate((voi
103f0 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  d**)&pInfo->aCol
10400 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
10410 61 43 6f 6c 5b 30 5d 29 2c 20 33 29 3b 0a 20 20  aCol[0]), 3);.  
10420 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 72  if( i<0 ){.    r
10430 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
10440 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a  return i;.}    .
10450 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
10460 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
10470 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
10480 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
10490 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
104a0 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
104b0 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
104c0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
104d0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
104e0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
104f0 67 49 6e 66 6f 46 75 6e 63 28 41 67 67 49 6e 66  gInfoFunc(AggInf
10500 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
10510 20 69 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65   i;.  i = sqlite
10520 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 28  3ArrayAllocate((
10530 76 6f 69 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e 61  void**)&pInfo->a
10540 46 75 6e 63 2c 20 73 69 7a 65 6f 66 28 70 49 6e  Func, sizeof(pIn
10550 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 20 32  fo->aFunc[0]), 2
10560 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
10570 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
10580 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
10590 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
105a0 20 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72   is an xFunc for
105b0 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
105c0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
105d0 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70  t .** sqlite3Exp
105e0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
105f0 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
10600 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
10610 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
10620 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
10630 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
10640 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
10650 65 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  es the aggregate
10660 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78   function at pEx
10670 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pr..*/.static in
10680 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
10690 74 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  te(void *pArg, E
106a0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
106b0 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
106c0 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65  ext *pNC = (Name
106d0 43 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a  Context *)pArg;.
106e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
106f0 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
10700 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
10710 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
10720 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
10730 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
10740 41 67 67 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73  AggInfo;.  ..  s
10750 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
10760 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
10770 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
10780 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
10790 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  if the column is
107a0 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
107b0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
107c0 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73  M.      ** claus
107d0 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
107e0 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  te query */.    
107f0 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29    if( pSrcList )
10800 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
10810 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
10820 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
10830 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  >a;.        for(
10840 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
10850 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
10860 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
10870 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
10880 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20  ol *pCol;.      
10890 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
108a0 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
108b0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
108c0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
108d0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
108e0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
108f0 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
10900 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
10910 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
10920 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
10930 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
10940 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
10950 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
10960 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
10970 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
10980 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
10990 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
109a0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
109b0 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
109c0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
109d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
109e0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
109f0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
10a00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
10a10 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
10a20 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 2c  o->nColumn; i++,
10a30 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
10a40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
10a50 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
10a60 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
10a80 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
10a90 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
10ab0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
10ac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
10ad0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
10ae0 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
10af0 6e 43 6f 6c 75 6d 6e 20 26 26 20 28 69 20 3d 20  nColumn && (i = 
10b00 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
10b10 28 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29  (pAggInfo))>=0 )
10b20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
10b30 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
10b40 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  ->aCol[i];.     
10b50 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
10b60 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
10b70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
10b80 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
10b90 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
10ba0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
10bb0 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
10bc0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
10be0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
10bf0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
10c00 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
10c10 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
10c20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
10c30 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
10c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
10c50 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
10c70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
10c80 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
10c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ca0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
10cb0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
10cc0 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
10cd0 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
10ce0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
10cf0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
10d00 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
10d10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
10d20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
10d30 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
10d60 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
10d70 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
10d80 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
10da0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
10db0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
10de0 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
10e00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
10e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10e20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10e40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
10e50 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
10e60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
10e70 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
10e80 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
10e90 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
10ea0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
10eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
10ed0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
10ee0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
10ef0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
10f00 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
10f10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
10f20 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
10f30 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
10f40 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
10f50 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
10f60 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
10f70 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
10f80 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
10f90 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
10fa0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
10fb0 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
10fc0 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
10fd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10fe0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
10ff0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
11000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
11010 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
11020 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
11030 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
11040 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
11050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11060 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45     } /* endif pE
11070 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74  xpr->iTable==pIt
11080 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20  em->iCursor */. 
11090 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
110a0 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69  loop over pSrcLi
110b0 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  st */.      }.  
110c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
110d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
110e0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
110f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43        /* The pNC
11100 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74  ->nDepth==0 test
11110 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61 74   causes aggregat
11120 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73  e functions in s
11130 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20 20  ubqueries.      
11140 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64  ** to be ignored
11150 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e   */.      if( pN
11160 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a  C->nDepth==0 ){.
11170 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
11180 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
11190 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
111a0 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
111b0 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
111c0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
111d0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
111e0 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
111f0 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
11200 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
11210 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
11220 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
11230 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
11240 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
11250 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
11260 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
11270 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
11280 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
11290 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b  pExpr, pExpr) ){
112a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
112b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
112c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
112d0 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66    if( i>=pAggInf
112e0 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20  o->nFunc ){.    
112f0 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69        /* pExpr i
11300 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b  s original.  Mak
11310 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  e a new entry in
11320 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
11330 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  [].          */.
11340 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e 63            u8 enc
11350 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
11360 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  nc;.          i 
11370 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  = addAggInfoFunc
11380 28 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  (pAggInfo);.    
11390 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
113a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
113b0 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
113c0 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
113d0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
113e0 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
113f0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
11400 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
11410 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Mem++;.         
11420 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20     pItem->pFunc 
11430 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
11440 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
11450 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11460 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
11470 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
11480 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n.n,.           
11490 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
114a0 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
114b0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
114c0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
114d0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
114e0 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
114f0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
11500 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
11510 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
11520 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
11530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11540 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
11550 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
11560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11580 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
11590 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
115a0 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
115b0 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
115c0 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
115d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45     */.        pE
115e0 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
115f0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
11600 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
11610 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
11620 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
11630 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63   }.  }..  /* Rec
11640 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73 75  ursively walk su
11650 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67  bqueries looking
11660 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e   for TK_COLUMN n
11670 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a 20  odes that need. 
11680 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67 65   ** to be change
11690 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  d to TK_AGG_COLU
116a0 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d 65  MN.  But increme
116b0 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68 61  nt nDepth so tha
116c0 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55  t.  ** TK_AGG_FU
116d0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
116e0 73 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c 20  subqueries will 
116f0 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  be unchanged..  
11700 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
11710 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
11720 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20  NC->nDepth++;.  
11730 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72    walkSelectExpr
11740 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c  (pExpr->pSelect,
11750 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
11760 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43  e, pNC);.    pNC
11770 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a  ->nDepth--;.  }.
11780 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
11790 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
117a0 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
117b0 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
117c0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
117d0 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
117e0 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
117f0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
11800 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
11810 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
11820 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
11830 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
11840 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
11850 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
11860 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11870 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
11880 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
11890 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
118a0 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
118b0 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  d by sqlite3Expr
118c0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a  ResolveNames()..
118d0 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20  **.** If errors 
118e0 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20  are seen, leave 
118f0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
11900 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20   in zErrMsg and 
11910 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  return.** the nu
11920 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
11930 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
11940 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
11950 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
11960 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
11970 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  r){.  int nErr =
11980 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45   pNC->pParse->nE
11990 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  rr;.  walkExprTr
119a0 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a  ee(pExpr, analyz
119b0 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29  eAggregate, pNC)
119c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e  ;.  return pNC->
119d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e  pParse->nErr - n
119e0 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  Err;.}../*.** Ca
119f0 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
11a00 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
11a10 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
11a20 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
11a30 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
11a40 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
11a50 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
11a60 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
11a70 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
11a80 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
11a90 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  hort..*/.int sql
11aa0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
11ab0 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
11ac0 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
11ad0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
11ae0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
11af0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
11b00 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  i;.  int nErr = 
11b10 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
11b20 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
11b30 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e  pList->a, i=0; n
11b40 45 72 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73  Err==0 && i<pLis
11b50 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
11b60 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  Item++){.      n
11b70 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 45 78  Err += sqlite3Ex
11b80 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
11b90 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
11ba0 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
11bb0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
11bc0 0a 7d 0a                                         .}.