/ Hex Artifact Content
Login

Artifact 2c32c546006627d70a7b941b318489980fd1912e:


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 38 34 20 32 30 30 37 2f 30 34 2f 31 33 20  .284 2007/04/13 
0220: 31 36 3a 30 36 3a 33 33 20 64 72 68 20 45 78 70  16:06:33 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 29 3b 0a 20 20 7d  xpr->token);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
05d0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
05e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
05f0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0600: 75 65 6e 63 65 20 66 6f 72 20 65 78 70 72 65 73  uence for expres
0610: 73 69 6f 6e 20 70 45 78 70 72 20 74 6f 20 62 65  sion pExpr to be
0620: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
0630: 2a 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64  * sequence named
0640: 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20 20 52 65   by pToken.   Re
0650: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
0660: 6f 20 74 68 65 20 72 65 76 69 73 65 64 20 65 78  o the revised ex
0670: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 68 65  pression..** The
0680: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0690: 6e 63 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  nce is marked as
06a0: 20 22 65 78 70 6c 69 63 69 74 22 20 75 73 69 6e   "explicit" usin
06b0: 67 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c  g the EP_ExpColl
06c0: 61 74 65 0a 2a 2a 20 66 6c 61 67 2e 20 20 41 6e  ate.** flag.  An
06d0: 20 65 78 70 6c 69 63 69 74 20 63 6f 6c 6c 61 74   explicit collat
06e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c  ing sequence wil
06f0: 6c 20 6f 76 65 72 72 69 64 65 20 69 6d 70 6c 69  l override impli
0700: 63 69 74 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  cit.** collating
0710: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 45   sequences..*/.E
0720: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0730: 53 65 74 43 6f 6c 6c 28 50 61 72 73 65 20 2a 70  SetColl(Parse *p
0740: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0750: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
0760: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
0770: 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 45 78 70 72  oll;.  if( pExpr
0780: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
0790: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
07a0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
07b0: 50 61 72 73 65 2c 20 28 63 68 61 72 2a 29 70 4e  Parse, (char*)pN
07c0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
07d0: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  );.  if( pColl )
07e0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f  {.    pExpr->pCo
07f0: 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
0800: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pExpr->flags |= 
0810: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
0820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0830: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0840: 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  rn the default c
0850: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0860: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0870: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0880: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
0890: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
08a0: 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  type, return 0..
08b0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
08c0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
08d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
08e0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
08f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0900: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  ;.  if( pExpr ){
0910: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78  .    pColl = pEx
0920: 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  pr->pColl;.    i
0930: 66 28 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  f( (pExpr->op==T
0940: 4b 5f 41 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_AS || pExpr->o
0950: 70 3d 3d 54 4b 5f 43 41 53 54 29 20 26 26 20 21  p==TK_CAST) && !
0960: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
0970: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0980: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
0990: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
09a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
09b0: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
09c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
09d0: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
09e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
09f0: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
0a00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f  ** pExpr is an o
0a10: 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70  perand of a comp
0a20: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0a30: 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a    aff2 is the.**
0a40: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
0a50: 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72  f the other oper
0a60: 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
0a70: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
0a80: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0a90: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
0aa0: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
0ab0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0ac0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0ad0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
0ae0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
0af0: 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20  r aff2){.  char 
0b00: 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78  aff1 = sqlite3Ex
0b10: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0b20: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26  );.  if( aff1 &&
0b30: 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20   aff2 ){.    /* 
0b40: 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  Both sides of th
0b50: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65  e comparison are
0b60: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65   columns. If one
0b70: 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20   has numeric.   
0b80: 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73   ** affinity, us
0b90: 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73  e that. Otherwis
0ba0: 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74  e use no affinit
0bb0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
0bc0: 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  ( sqlite3IsNumer
0bd0: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29  icAffinity(aff1)
0be0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d   || sqlite3IsNum
0bf0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66  ericAffinity(aff
0c00: 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  2) ){.      retu
0c10: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
0c20: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  MERIC;.    }else
0c30: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
0c40: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
0c50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
0c60: 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32  ( !aff1 && !aff2
0c70: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68   ){.    /* Neith
0c80: 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  er side of the c
0c90: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
0ca0: 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20  olumn.  Compare 
0cb0: 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
0cc0: 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20  ts directly..   
0cd0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
0ce0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
0cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
0d00: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
0d10: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
0d20: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
0d30: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
0d40: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
0d50: 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32   aff1==0 || aff2
0d60: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
0d70: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
0d80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
0d90: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0da0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
0db0: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
0dc0: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0dd0: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
0de0: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
0df0: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
0e00: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
0e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
0e20: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
0e30: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
0e40: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
0e50: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0e60: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
0e70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
0e80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
0e90: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0ea0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
0eb0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0ec0: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
0ed0: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
0ee0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0ef0: 4b 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_NE );.  assert
0f00: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
0f10: 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65  ;.  aff = sqlite
0f20: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
0f30: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
0f40: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
0f50: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
0f60: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0f70: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67  nity(pExpr->pRig
0f80: 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20  ht, aff);.  }.  
0f90: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
0fa0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61  pSelect ){.    a
0fb0: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0fc0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0fd0: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
0fe0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
0ff0: 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  aff);.  }.  else
1000: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
1010: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1020: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65  F_NONE;.  }.  re
1030: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1040: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1050: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1060: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1070: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1080: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1090: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
10a0: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
10b0: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
10c0: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
10d0: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
10e0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
10f0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1100: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
1110: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1120: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1130: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1140: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1150: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1160: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1170: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1180: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1190: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
11a0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  se SQLITE_AFF_NO
11b0: 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  NE:.      return
11c0: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
11d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
11e0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
11f0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
1200: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
1210: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1220: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1230: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1240: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1250: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1260: 74 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61  the P1 value tha
1270: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1280: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1290: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
12a0: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
12b0: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
12c0: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
12d0: 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20  d pExpr2..** If 
12e0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72  jumpIfNull is tr
12f0: 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  ue, then set the
1300: 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65   low byte of the
1310: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20   returned.** P1 
1320: 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68  value to tell th
1330: 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70  e opcode to jump
1340: 20 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65   if either expre
1350: 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74  ssion.** evaluat
1360: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  es to NULL..*/.s
1370: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79  tatic int binary
1380: 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a  CompareP1(Expr *
1390: 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45  pExpr1, Expr *pE
13a0: 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66  xpr2, int jumpIf
13b0: 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66  Null){.  char af
13c0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
13d0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
13e0: 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e 74 29  .  return ((int)
13f0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1400: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
1410: 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c  ff))+(jumpIfNull
1420: 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f 2a  ?0x100:0);.}../*
1430: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1440: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1450: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1460: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1470: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1480: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1490: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
14a0: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
14b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
14c0: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
14d0: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
14e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
14f0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
1500: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
1510: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1520: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
1530: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
1540: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1550: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1560: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1570: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1580: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1590: 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  ** type..*/.stat
15a0: 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61  ic CollSeq* bina
15b0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
15c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15d0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
15e0: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f  r *pRight){.  Co
15f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1600: 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
1610: 0a 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68  .  assert( pRigh
1620: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
1630: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1640: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61  Collate ){.    a
1650: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43  ssert( pLeft->pC
1660: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1670: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1680: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
1690: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
16a0: 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
16b0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
16c0: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70  ->pColl );.    p
16d0: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
16e0: 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Coll;.  }else{. 
16f0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1700: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1710: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
1720: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1730: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1740: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1750: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1760: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1770: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
1780: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1790: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
17a0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
17b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
17c0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
17d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
17e0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
17f0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1800: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
1810: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1820: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
1830: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
1840: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1850: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1860: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
1870: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
1880: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
1890: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
18a0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
18b0: 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a  here if true.  *
18c0: 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
18d0: 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65  ll    /* If true
18e0: 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72  , jump if either
18f0: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
1900: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 31 20   */.){.  int p1 
1910: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
1920: 31 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  1(pLeft, pRight,
1930: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1940: 43 6f 6c 6c 53 65 71 20 2a 70 33 20 3d 20 62 69  CollSeq *p3 = bi
1950: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1960: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
1970: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 72 65 74  , pRight);.  ret
1980: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 4f  urn sqlite3VdbeO
1990: 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
19a0: 2c 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 64 65  , opcode, p1, de
19b0: 73 74 2c 20 28 76 6f 69 64 2a 29 70 33 2c 20 50  st, (void*)p3, P
19c0: 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 7d 0a 0a 2f  3_COLLSEQ);.}../
19d0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
19e0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
19f0: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1a00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1a10: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1a20: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1a30: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1a40: 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  eMalloc().  The 
1a50: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1a60: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
1a70: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
1a80: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
1a90: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
1aa0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
1ab0: 74 65 33 45 78 70 72 28 69 6e 74 20 6f 70 2c 20  te3Expr(int op, 
1ac0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1ad0: 72 20 2a 70 52 69 67 68 74 2c 20 63 6f 6e 73 74  r *pRight, const
1ae0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1af0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
1b00: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1b10: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
1b20: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
1b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68  ==0 ){.    /* Wh
1b40: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c  en malloc fails,
1b50: 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61 6e   delete pLeft an
1b60: 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65 73  d pRight. Expres
1b70: 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f 20  sions passed to 
1b80: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
1b90: 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79  ction must alway
1ba0: 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 77  s be allocated w
1bb0: 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72 28  ith sqlite3Expr(
1bc0: 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20 20  ) for this .    
1bd0: 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20 20  ** reason. .    
1be0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
1bf0: 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b  prDelete(pLeft);
1c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c10: 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a  Delete(pRight);.
1c20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c30: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f  }.  pNew->op = o
1c40: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  p;.  pNew->pLeft
1c50: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77   = pLeft;.  pNew
1c60: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
1c70: 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20  t;.  pNew->iAgg 
1c80: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f 6b  = -1;.  if( pTok
1c90: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
1ca0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
1cb0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70   );.    pNew->sp
1cc0: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
1cd0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
1ce0: 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29 7b  lse if( pLeft ){
1cf0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
1d00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d10: 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26  ExprSpan(pNew, &
1d20: 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52  pLeft->span, &pR
1d30: 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  ight->span);.   
1d40: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66     if( pRight->f
1d50: 6c 61 67 73 20 26 26 20 45 50 5f 45 78 70 43 6f  lags && EP_ExpCo
1d60: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
1d70: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1d80: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1d90: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
1da0: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
1db0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1dc0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  }.    if( pLeft-
1dd0: 3e 66 6c 61 67 73 20 26 26 20 45 50 5f 45 78 70  >flags && EP_Exp
1de0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
1df0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1e00: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1e10: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
1e20: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e40: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1e50: 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ** Works like sq
1e60: 6c 69 74 65 33 45 78 70 72 28 29 20 62 75 74 20  lite3Expr() but 
1e70: 66 72 65 65 73 20 69 74 73 20 70 4c 65 66 74 20  frees its pLeft 
1e80: 61 6e 64 20 70 52 69 67 68 74 20 61 72 67 75 6d  and pRight argum
1e90: 65 6e 74 73 0a 2a 2a 20 69 66 20 69 74 20 66 61  ents.** if it fa
1ea0: 69 6c 73 20 64 75 65 20 74 6f 20 61 20 6d 61 6c  ils due to a mal
1eb0: 6c 6f 63 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  loc problem..*/.
1ec0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
1ed0: 72 4f 72 46 72 65 65 28 69 6e 74 20 6f 70 2c 20  rOrFree(int op, 
1ee0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1ef0: 72 20 2a 70 52 69 67 68 74 2c 20 63 6f 6e 73 74  r *pRight, const
1f00: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1f10: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20  .  Expr *pNew = 
1f20: 73 71 6c 69 74 65 33 45 78 70 72 28 6f 70 2c 20  sqlite3Expr(op, 
1f30: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70  pLeft, pRight, p
1f40: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4e  Token);.  if( pN
1f50: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
1f60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
1f70: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
1f80: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 52 69  e3ExprDelete(pRi
1f90: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
1fa0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
1fb0: 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e  * When doing a n
1fc0: 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f 75  ested parse, you
1fd0: 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65 72   can include ter
1fe0: 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ms in an express
1ff0: 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b  ion.** that look
2000: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23 30   like this:   #0
2010: 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65 73   #1 #2 ...  Thes
2020: 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74 6f  e terms refer to
2030: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20   elements.** on 
2040: 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30 22  the stack.  "#0"
2050: 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20 6f   means the top o
2060: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20  f the stack..** 
2070: 22 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20 6e  "#1" means the n
2080: 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20  ext down on the 
2090: 73 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66  stack.  And so f
20a0: 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  orth..**.** This
20b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
20c0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
20d0: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f 6e   to deal with on
20e0: 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 2e   of those terms.
20f0: 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74 65  .** It immediate
2100: 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ly generates cod
2110: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76  e to store the v
2120: 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79  alue in a memory
2130: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68   location..** Th
2140: 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78 70  e returns an exp
2150: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69 6c  ression that wil
2160: 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  l code to extrac
2170: 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  t the value from
2180: 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  .** that memory 
2190: 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65 64  location as need
21a0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
21b0: 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72  ite3RegisterExpr
21c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21d0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
21e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
21f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70  se->pVdbe;.  Exp
2200: 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70 74  r *p;.  int dept
2210: 68 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  h;.  if( pParse-
2220: 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
2230: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2240: 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20  g(pParse, "near 
2250: 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65  \"%T\": syntax e
2260: 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  rror", pToken);.
2270: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2280: 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  }.  if( v==0 ) r
2290: 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 73  eturn 0;.  p = s
22a0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52 45  qlite3Expr(TK_RE
22b0: 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70 54  GISTER, 0, 0, pT
22c0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d  oken);.  if( p==
22d0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
22e0: 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  0;  /* Malloc fa
22f0: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64 65  iled */.  }.  de
2300: 70 74 68 20 3d 20 61 74 6f 69 28 28 63 68 61 72  pth = atoi((char
2310: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
2320: 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20  ;.  p->iTable = 
2330: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
2340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2350: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64 65  Op(v, OP_Dup, de
2360: 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  pth, 0);.  sqlit
2370: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2380: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e 69  P_MemStore, p->i
2390: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65 74  Table, 1);.  ret
23a0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
23b0: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
23c0: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
23d0: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
23e0: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
23f0: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
2400: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
2410: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
2420: 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ion..*/.Expr *sq
2430: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78 70  lite3ExprAnd(Exp
2440: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
2450: 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  pRight){.  if( p
2460: 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Left==0 ){.    r
2470: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
2480: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
2490: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
24a0: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
24b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
24c0: 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c  ite3Expr(TK_AND,
24d0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
24e0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
24f0: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70   Set the Expr.sp
2500: 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  an field of the 
2510: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
2520: 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20   to span all.** 
2530: 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65  text between the
2540: 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e   two given token
2550: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2560: 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72 20  e3ExprSpan(Expr 
2570: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
2580: 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69  Left, Token *pRi
2590: 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ght){.  assert( 
25a0: 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61  pRight!=0 );.  a
25b0: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
25c0: 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  );.  if( !sqlite
25d0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
25e0: 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26 20  && pRight->z && 
25f0: 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
2600: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 64  assert( pLeft->d
2610: 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e  yn==0 || pLeft->
2620: 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29  z[pLeft->n]==0 )
2630: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  ;.    if( pLeft-
2640: 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67 68  >dyn==0 && pRigh
2650: 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20  t->dyn==0 ){.   
2660: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
2670: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
2680: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e     pExpr->span.n
2690: 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28   = pRight->n + (
26a0: 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66  pRight->z - pLef
26b0: 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t->z);.    }else
26c0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  {.      pExpr->s
26d0: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d  pan.z = 0;.    }
26e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
26f0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
2700: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
2710: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
2720: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
2730: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
2740: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
2750: 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a  ction(ExprList *
2760: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
2770: 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  oken){.  Expr *p
2780: 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 70  New;.  assert( p
2790: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
27a0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
27b0: 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a  sizeof(Expr) );.
27c0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
27d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
27f0: 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  ); /* Avoid leak
2800: 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20  ing memory when 
2810: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2820: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2830: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  }.  pNew->op = T
2840: 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e  K_FUNCTION;.  pN
2850: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
2860: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  t;.  assert( pTo
2870: 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20  ken->dyn==0 );. 
2880: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
2890: 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e  pToken;.  pNew->
28a0: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
28b0: 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  en;.  return pNe
28c0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
28d0: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
28e0: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
28f0: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
2900: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
2910: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
2920: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
2930: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
2940: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
2950: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
2960: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
2970: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
2980: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2990: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
29a0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
29b0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
29c0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
29d0: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
29e0: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
29f0: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
2a00: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
2a10: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
2a20: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
2a30: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
2a40: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
2a50: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
2a60: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2a70: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2a80: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
2a90: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
2aa0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
2ab0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
2ac0: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
2ad0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
2ae0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2af0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
2b00: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
2b10: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
2b20: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
2b30: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
2b40: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
2b50: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
2b60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2b70: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b  r *pExpr){.  Tok
2b80: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69 66  en *pToken;.  if
2b90: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
2ba0: 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20  urn;.  pToken = 
2bb0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pExpr->token;. 
2bc0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2bd0: 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  >n>=1 );.  asser
2be0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
2bf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  );.  assert( pTo
2c00: 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ken->z[0]!=0 );.
2c10: 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d    if( pToken->n=
2c20: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =1 ){.    /* Wil
2c30: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2c40: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
2c50: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
2c60: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70   number */.    p
2c70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b  Expr->iTable = +
2c80: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20  +pParse->nVar;. 
2c90: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65   }else if( pToke
2ca0: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  n->z[0]=='?' ){.
2cb0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
2cc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
2cd0: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
2ce0: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
2cf0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20   and.    ** use 
2d00: 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62  it as the variab
2d10: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
2d20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70   int i;.    pExp
2d30: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20  r->iTable = i = 
2d40: 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f  atoi((char*)&pTo
2d50: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20  ken->z[1]);.    
2d60: 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c  if( i<1 || i>SQL
2d70: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
2d80: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20  _NUMBER ){.     
2d90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2da0: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
2db0: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
2dc0: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
2dd0: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
2de0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
2df0: 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20  ABLE_NUMBER);.  
2e00: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50    }.    if( i>pP
2e10: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
2e20: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2e30: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = i;.    }.  }e
2e40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  lse{.    /* Wild
2e50: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2e60: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2e70: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
2e80: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
2e90: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
2ea0: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
2eb0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
2ec0: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
2ed0: 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ame.    ** has n
2ee0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
2ef0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
2f00: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
2f10: 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mber.    */.    
2f20: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20  int i, n;.    n 
2f30: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20  = pToken->n;.   
2f40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
2f50: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b  se->nVarExpr; i+
2f60: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
2f70: 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  pE;.      if( (p
2f80: 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61  E = pParse->apVa
2f90: 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20  rExpr[i])!=0.   
2fa0: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f         && pE->to
2fb0: 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20  ken.n==n.       
2fc0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d     && memcmp(pE-
2fd0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e  >token.z, pToken
2fe0: 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ->z, n)==0 ){.  
2ff0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
3000: 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65  ble = pE->iTable
3010: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3020: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3030: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
3040: 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20  ->nVarExpr ){.  
3050: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
3060: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
3070: 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ar;.      if( pP
3080: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d  arse->nVarExpr>=
3090: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
30a0: 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
30b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
30c0: 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72  xprAlloc += pPar
30d0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
30e0: 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  c + 10;.        
30f0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
3100: 72 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  r = sqliteReallo
3110: 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
3120: 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20  apVarExpr,.     
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
3150: 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  prAlloc*sizeof(p
3160: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
3170: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  [0]) );.      }.
3180: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
3190: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
31a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
31b0: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61  rt( pParse->apVa
31c0: 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  rExpr!=0 );.    
31d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
31e0: 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56  rExpr[pParse->nV
31f0: 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70  arExpr++] = pExp
3200: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
3210: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .  } .}../*.** R
3220: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
3230: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
3240: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
3250: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3260: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
3270: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
3280: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e   if( p->span.dyn
3290: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
32a0: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b  har*)p->span.z);
32b0: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
32c0: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
32d0: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
32e0: 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  .z);.  sqlite3Ex
32f0: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66  prDelete(p->pLef
3300: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
3310: 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68  rDelete(p->pRigh
3320: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
3330: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
3340: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
3350: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e  SelectDelete(p->
3360: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
3370: 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  teFree(p);.}../*
3380: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b  .** The Expr.tok
3390: 65 6e 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62  en field might b
33a0: 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  e a string liter
33b0: 61 6c 20 74 68 61 74 20 69 73 20 71 75 6f 74 65  al that is quote
33c0: 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d  d..** If so, rem
33d0: 6f 76 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f  ove the quotatio
33e0: 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  n marks..*/.void
33f0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
3400: 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  xpr(Expr *p){.  
3410: 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72  if( ExprHasAnyPr
3420: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71  operty(p, EP_Deq
3430: 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65  uoted) ){.    re
3440: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72  turn;.  }.  Expr
3450: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
3460: 50 5f 44 65 71 75 6f 74 65 64 29 3b 0a 20 20 69  P_Dequoted);.  i
3470: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d  f( p->token.dyn=
3480: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3490: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74  3TokenCopy(&p->t
34a0: 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29  oken, &p->token)
34b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
34c0: 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d  equote((char*)p-
34d0: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f  >token.z);.}.../
34e0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
34f0: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
3500: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
3510: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
3520: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
3530: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
3540: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
3550: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
3560: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
3570: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
3580: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
3590: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
35a0: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
35b0: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
35c0: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
35d0: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
35e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
35f0: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
3600: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
3610: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
3620: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
3630: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
3640: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
3650: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
3660: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
3670: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
3680: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
3690: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
36a0: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
36b0: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
36c0: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
36d0: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
36e0: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
36f0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3700: 65 33 45 78 70 72 44 75 70 28 45 78 70 72 20 2a  e3ExprDup(Expr *
3710: 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  p){.  Expr *pNew
3720: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3730: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3740: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3750: 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  w( sizeof(*p) );
3760: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
3780: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
3790: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
37a0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
37b0: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
37c0: 6b 65 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c  ken.z = (u8*)sql
37d0: 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
37e0: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d  *)p->token.z, p-
37f0: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70  >token.n);.    p
3800: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  New->token.dyn =
3810: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3820: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74   assert( pNew->t
3830: 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d  oken.z==0 );.  }
3840: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20  .  pNew->span.z 
3850: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65  = 0;.  pNew->pLe
3860: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
3870: 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  Dup(p->pLeft);. 
3880: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
3890: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
38a0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65  ->pRight);.  pNe
38b0: 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  w->pList = sqlit
38c0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
38d0: 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d  >pList);.  pNew-
38e0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
38f0: 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70  e3SelectDup(p->p
3900: 53 65 6c 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d  Select);.  pNew-
3910: 3e 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b  >pTab = p->pTab;
3920: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3930: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f  }.void sqlite3To
3940: 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70  kenCopy(Token *p
3950: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
3960: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
3970: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
3980: 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20  char*)pTo->z);. 
3990: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b   if( pFrom->z ){
39a0: 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46  .    pTo->n = pF
39b0: 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d  rom->n;.    pTo-
39c0: 3e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  >z = (u8*)sqlite
39d0: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
39e0: 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e  From->z, pFrom->
39f0: 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e  n);.    pTo->dyn
3a00: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3a10: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20     pTo->z = 0;. 
3a20: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
3a30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3a40: 70 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a  p(ExprList *p){.
3a50: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
3a60: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
3a70: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
3a80: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
3a90: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3aa0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3ab0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3ac0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
3ad0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3ae0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3af0: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e  pNew->nExpr = pN
3b00: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3b10: 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61  nExpr;.  pNew->a
3b20: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
3b30: 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70  eMalloc( p->nExp
3b40: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  r*sizeof(p->a[0]
3b50: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
3b60: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
3b70: 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
3b80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
3b90: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
3ba0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
3bb0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
3bc0: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
3bd0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3be0: 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78  NewExpr, *pOldEx
3bf0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
3c00: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
3c10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3c20: 28 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  (pOldExpr = pOld
3c30: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
3c40: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e    if( pOldExpr->
3c50: 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65  span.z!=0 && pNe
3c60: 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f  wExpr ){.      /
3c70: 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20  * Always make a 
3c80: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e  copy of the span
3c90: 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65   for top-level e
3ca0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
3cb0: 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
3cc0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
3cd0: 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54   logic in SELECT
3ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
3cf0: 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20   determines.    
3d00: 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f    ** the names o
3d10: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
3d20: 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64   result set need
3d30: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
3d40: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
3d50: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e  te3TokenCopy(&pN
3d60: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
3d70: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
3d80: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
3d90: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
3da0: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
3db0: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
3dc0: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
3dd0: 70 61 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20  pan.z==0.       
3de0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d       || sqlite3M
3df0: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b  allocFailed() );
3e00: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
3e10: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
3e20: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
3e30: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
3e40: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
3e50: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
3e60: 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20     pItem->isAgg 
3e70: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67  = pOldItem->isAg
3e80: 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  g;.    pItem->do
3e90: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ne = 0;.  }.  re
3ea0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3eb0: 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20  .** If cursors, 
3ec0: 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20  triggers, views 
3ed0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61  and subqueries a
3ee0: 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66  re all omitted f
3ef0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  rom.** the build
3f00: 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74  , then none of t
3f10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
3f20: 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f  tines, except fo
3f30: 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  r .** sqlite3Sel
3f40: 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65  ectDup(), can be
3f50: 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33   called. sqlite3
3f60: 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73  SelectDup() is s
3f70: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c  ometimes.** call
3f80: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61  ed with a NULL a
3f90: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
3fa0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3fb0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
3fc0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3fd0: 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c  IT_TRIGGER) \. |
3fe0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
3ff0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
4000: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
4010: 33 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c  3SrcListDup(SrcL
4020: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
4030: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
4040: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
4050: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4060: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
4070: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
4080: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
4090: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
40a0: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
40b0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
40c0: 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29  llocRaw( nByte )
40d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
40e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
40f0: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
4100: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
4110: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
4120: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
4130: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
4140: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
4150: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
4160: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
4170: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
4180: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
4190: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
41a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
41b0: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53  tabase = sqliteS
41c0: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
41d0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
41e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
41f0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
4200: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
4210: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
4220: 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74  Alias = sqliteSt
4230: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
4240: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
4250: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
4260: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
4270: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
4280: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
4290: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
42a0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
42b0: 50 6f 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64  Populated = pOld
42c0: 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
42d0: 64 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e  d;.    pTab = pN
42e0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
42f0: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
4300: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
4310: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
4320: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
4330: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
4340: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
4350: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c  p(pOldItem->pSel
4360: 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ect);.    pNewIt
4370: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
4380: 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65  3ExprDup(pOldIte
4390: 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65  m->pOn);.    pNe
43a0: 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  wItem->pUsing = 
43b0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
43c0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e  (pOldItem->pUsin
43d0: 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  g);.    pNewItem
43e0: 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64  ->colUsed = pOld
43f0: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
4400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
4410: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
4420: 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c  te3IdListDup(IdL
4430: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
4440: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
4450: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
4460: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
4470: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
4480: 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  w( sizeof(*pNew)
4490: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
44a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
44b0: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
44c0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
44d0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
44e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
44f0: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
4500: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
4510: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
4520: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65    sqliteFree(pNe
4530: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
4540: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
4550: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
4560: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
4570: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
4580: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
4590: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
45a0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
45b0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
45c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
45d0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
45e0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
45f0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4600: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
4610: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
4620: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
4630: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
4640: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
4650: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
4660: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
4670: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
4680: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
4690: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
46a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
46b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
46c0: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
46d0: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
46e0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
46f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4700: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  (p->pEList);.  p
4710: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
4720: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d  te3SrcListDup(p-
4730: 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e  >pSrc);.  pNew->
4740: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
4750: 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72  ExprDup(p->pWher
4760: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
4770: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
4780: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72  prListDup(p->pGr
4790: 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  oupBy);.  pNew->
47a0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
47b0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76  3ExprDup(p->pHav
47c0: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
47d0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
47e0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
47f0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77  OrderBy);.  pNew
4800: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
4810: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73  pNew->pPrior = s
4820: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
4830: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
4840: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  ew->pLimit = sql
4850: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
4860: 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Limit);.  pNew->
4870: 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65  pOffset = sqlite
4880: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66  3ExprDup(p->pOff
4890: 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  set);.  pNew->iL
48a0: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  imit = -1;.  pNe
48b0: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  w->iOffset = -1;
48c0: 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c  .  pNew->isResol
48d0: 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c  ved = p->isResol
48e0: 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41  ved;.  pNew->isA
48f0: 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
4900: 20 70 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20   pNew->usesEphm 
4910: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73  = 0;.  pNew->dis
4920: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30  allowOrderBy = 0
4930: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
4940: 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  most = 0;.  pNew
4950: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
4960: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
4970: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
4980: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
4990: 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
49a0: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  -1;.  return pNe
49b0: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
49c0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
49d0: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
49e0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
49f0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4a00: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
4a10: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
4a20: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
4a30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
4a40: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
4a50: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
4a60: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
4a70: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
4a80: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
4a90: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
4aa0: 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73  stAppend(ExprLis
4ab0: 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a  t *pList, Expr *
4ac0: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
4ad0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ame){.  if( pLis
4ae0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
4af0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
4b00: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  ( sizeof(ExprLis
4b10: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
4b20: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
4b30: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
4b40: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
4b50: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20  List->nAlloc==0 
4b60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  );.  }.  if( pLi
4b70: 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73  st->nAlloc<=pLis
4b80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
4b90: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
4ba0: 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74  item *a;.    int
4bb0: 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   n = pList->nAll
4bc0: 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20  oc*2 + 4;.    a 
4bd0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
4be0: 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65  pList->a, n*size
4bf0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
4c00: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
4c10: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
4c20: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
4c30: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20  List->a = a;.   
4c40: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
4c50: 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   n;.  }.  assert
4c60: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
4c70: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
4c80: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72  pName ){.    str
4c90: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4ca0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
4cb0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
4cc0: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
4cd0: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
4ce0: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
4cf0: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
4d00: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4d10: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
4d20: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
4d30: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Expr;.  }.  retu
4d40: 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65  rn pList;..no_me
4d50: 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f  m:     .  /* Avo
4d60: 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72  id leaking memor
4d70: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20  y if malloc has 
4d80: 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c  failed. */.  sql
4d90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
4da0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
4db0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
4dc0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
4dd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
4de0: 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70  te an entire exp
4df0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
4e00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
4e10: 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72  rListDelete(Expr
4e20: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
4e30: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
4e40: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
4e50: 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
4e60: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
4e70: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
4e80: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
4e90: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
4ea0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
4eb0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
4ec0: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
4ed0: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
4ee0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
4ef0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
4f00: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
4f10: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
4f20: 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
4f30: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
4f40: 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
4f50: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
4f60: 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
4f70: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
4f80: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
4f90: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
4fa0: 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20  ion tree.  Call 
4fb0: 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e  xFunc for each n
4fc0: 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a  ode visited..**.
4fd0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
4fe0: 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64  lue from xFunc d
4ff0: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
5000: 72 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20  r the tree walk 
5010: 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20  continues..** 0 
5020: 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77  means continue w
5030: 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e  alking the tree.
5040: 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74    1 means do not
5050: 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a   walk children.*
5060: 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  * of the current
5070: 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e   node but contin
5080: 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73  ue with siblings
5090: 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64  .  2 means aband
50a0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77  on.** the tree w
50b0: 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a  alk completely..
50c0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
50d0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73   value from this
50e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f   routine is 1 to
50f0: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
5100: 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20  e walk.** and 0 
5110: 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
5120: 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73  ** NOTICE:  This
5130: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e   routine does *n
5140: 6f 74 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f  ot* descend into
5150: 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a   subqueries..*/.
5160: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
5170: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
5180: 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64   *, int (*)(void
5190: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
51a0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
51b0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70  walkExprTree(Exp
51c0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a  r *pExpr, int (*
51d0: 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70  xFunc)(void*,Exp
51e0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
51f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
5200: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
5210: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a  urn 0;.  rc = (*
5220: 78 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78  xFunc)(pArg, pEx
5230: 70 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  pr);.  if( rc==0
5240: 20 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   ){.    if( walk
5250: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e  ExprTree(pExpr->
5260: 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41  pLeft, xFunc, pA
5270: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
5280: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
5290: 54 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67  Tree(pExpr->pRig
52a0: 68 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ht, xFunc, pArg)
52b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
52c0: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73   if( walkExprLis
52d0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20  t(pExpr->pList, 
52e0: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
52f0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
5300: 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f  eturn rc>1;.}../
5310: 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78  *.** Call walkEx
5320: 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65  prTree() for eve
5330: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
5340: 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74   list p..*/.stat
5350: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c  ic int walkExprL
5360: 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c  ist(ExprList *p,
5370: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
5380: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
5390: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
53a0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
53b0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
53c0: 6d 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  m;.  if( !p ) re
53d0: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
53e0: 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  p->nExpr, pItem=
53f0: 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  p->a; i>0; i--, 
5400: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
5410: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
5420: 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75  Item->pExpr, xFu
5430: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
5440: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
5450: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
5460: 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65  all walkExprTree
5470: 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
5480: 72 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63  ression in Selec
5490: 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69  t p, not includi
54a0: 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
54b0: 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
54c0: 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69  of sub-selects i
54d0: 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73  n any FROM claus
54e0: 65 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a  e or the LIMIT.*
54f0: 2a 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72  * or OFFSET expr
5500: 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61  essions...*/.sta
5510: 74 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65  tic int walkSele
5520: 63 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70  ctExpr(Select *p
5530: 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76  , int (*xFunc)(v
5540: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
5550: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61  oid *pArg){.  wa
5560: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  lkExprList(p->pE
5570: 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  List, xFunc, pAr
5580: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
5590: 65 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46  ee(p->pWhere, xF
55a0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
55b0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  lkExprList(p->pG
55c0: 72 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70  roupBy, xFunc, p
55d0: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
55e0: 54 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Tree(p->pHaving,
55f0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
5600: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
5610: 3e 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63  >pOrderBy, xFunc
5620: 2c 20 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72  , pArg);.  retur
5630: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
5640: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64  his routine is d
5650: 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46  esigned as an xF
5660: 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
5670: 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41  Tree()..**.** pA
5680: 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  rg is really a p
5690: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
56a0: 65 67 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e  eger.  If we can
56b0: 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67   tell by looking
56c0: 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68 61  .** at pExpr tha
56d0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
56e0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70   that contains p
56f0: 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f  Expr is not a co
5700: 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73  nstant.** expres
5710: 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a  sion, then set *
5720: 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65  pArg to 0 and re
5730: 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f  turn 2 to abando
5740: 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e  n the tree walk.
5750: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65  .** If pExpr doe
5760: 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75  s does not disqu
5770: 61 6c 69 66 79 20 74 68 65 20 65 78 70 72 65 73  alify the expres
5780: 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20  sion from being 
5790: 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  a constant.** th
57a0: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
57b0: 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69  *.** After walki
57c0: 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65  ng the whole tre
57d0: 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61  e, if no nodes a
57e0: 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69  re found that di
57f0: 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20  squalify.** the 
5800: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f  expression as co
5810: 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20  nstant, then we 
5820: 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65  assume the whole
5830: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
5840: 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65  s constant.  See
5850: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
5860: 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64  nstant() for add
5870: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
5880: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
5890: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
58a0: 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67  stant(void *pArg
58b0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
58c0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
58d0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
58e0: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
58f0: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
5900: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
5910: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
5920: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a  ant.    ** and *
5930: 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63  pArg==2 */.    c
5940: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5950: 0a 20 20 20 20 20 20 69 66 28 20 2a 28 28 69 6e  .      if( *((in
5960: 74 2a 29 70 41 72 67 29 3d 3d 32 20 29 20 72 65  t*)pArg)==2 ) re
5970: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a  turn 0;.      /*
5980: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
5990: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
59a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
59b0: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
59c0: 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  _DOT:.    case T
59d0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
59e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
59f0: 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20  COLUMN:.#ifndef 
5a00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5a10: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
5a20: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
5a30: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e  e TK_EXISTS:.#en
5a40: 64 69 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74  dif.      *((int
5a50: 2a 29 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20  *)pArg) = 0;.   
5a60: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
5a70: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20   case TK_IN:.   
5a80: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
5a90: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
5aa0: 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d   *((int*)pArg) =
5ab0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
5ac0: 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 2;.      }.  
5ad0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
5ae0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
5af0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
5b00: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
5b10: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
5b20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5b30: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
5b40: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
5b50: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
5b60: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
5b70: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
5b80: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
5b90: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
5ba0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
5bb0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
5bc0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
5bd0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
5be0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
5bf0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
5c00: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
5c10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5c20: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
5c30: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f   *p){.  int isCo
5c40: 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45  nst = 1;.  walkE
5c50: 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e  xprTree(p, exprN
5c60: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26  odeIsConstant, &
5c70: 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75  isConst);.  retu
5c80: 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f  rn isConst;.}../
5c90: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
5ca0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
5cb0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
5cc0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
5cd0: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
5ce0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
5cf0: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
5d00: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
5d10: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
5d20: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
5d30: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
5d40: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
5d50: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
5d60: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
5d70: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
5d80: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
5d90: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
5da0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
5db0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
5dc0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
5dd0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5de0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
5df0: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
5e00: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5e10: 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 2;.  walkExp
5e20: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
5e30: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
5e40: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
5e50: 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a   isConst!=0;.}..
5e60: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
5e70: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
5e80: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
5e90: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
5ea0: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
5eb0: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
5ec0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
5ed0: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
5ee0: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
5ef0: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
5f00: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
5f10: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
5f20: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
5f30: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
5f40: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
5f50: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
5f60: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
5f70: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
5f80: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
5f90: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
5fa0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
5fb0: 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68  Value){.  switch
5fc0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
5fd0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
5fe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
5ff0: 74 65 33 47 65 74 49 6e 74 33 32 28 28 63 68 61  te3GetInt32((cha
6000: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  r*)p->token.z, p
6010: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
6020: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6030: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6040: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6050: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
6060: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6070: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
6080: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
6090: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
60a0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
60b0: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
60c0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
60d0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
60e0: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
60f0: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
6100: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
6110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6120: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6130: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
6140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6160: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
6170: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
6180: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
6190: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
61a0: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
61b0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
61c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
61d0: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
61e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
61f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6200: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
6210: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
6220: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6230: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
6240: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
6250: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
6260: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
6270: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
6280: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
6290: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
62a0: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
62b0: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
62c0: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
62d0: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
62e0: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
62f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
6300: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
6310: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
6320: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
6330: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
6340: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
6350: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
6360: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
6370: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
6380: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
6390: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
63a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
63c0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
63d0: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
63e0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
63f0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
6400: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
6410: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
6430: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
6440: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
6450: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
6460: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
6470: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
6480: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
6490: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
64a0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
64b0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
64c0: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
64d0: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
64e0: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
64f0: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
6500: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
6510: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
6520: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
6530: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
6540: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
6550: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
6560: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
6570: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
6580: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
6590: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
65a0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
65b0: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
65c0: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
65d0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
65e0: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
65f0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
6600: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
6610: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
6620: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
6630: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
6640: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
6650: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
6660: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
6670: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
6680: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
6690: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
66a0: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
66b0: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
66c0: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
66d0: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
66e0: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
66f0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
6700: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
6710: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
6720: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
6730: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
6740: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
6750: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
6760: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6770: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
6780: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6790: 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c  Token *pDbToken,
67a0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
67b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
67c0: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f  taining table, o
67d0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
67e0: 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20  n *pTableToken, 
67f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
6800: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c  e containing col
6810: 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  umn, or NULL */.
6820: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e    Token *pColumn
6830: 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f  Token, /* Name o
6840: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f  f the column. */
6850: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
6860: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
6870: 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64  ame context used
6880: 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20   to resolve the 
6890: 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
68a0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f  pExpr          /
68b0: 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52  * Make this EXPR
68c0: 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74   node point to t
68d0: 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
68e0: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  mn */.){.  char 
68f0: 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  *zDb = 0;       
6900: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
6910: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58  atabase.  The "X
6920: 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20  " in X.Y.Z */.  
6930: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20  char *zTab = 0; 
6940: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6950: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
6960: 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20  "Y" in X.Y.Z or 
6970: 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  Y.Z */.  char *z
6980: 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Col = 0;      /*
6990: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
69a0: 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f  umn.  The "Z" */
69b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
69c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
69d0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
69e0: 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  t cnt = 0;      
69f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6a00: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
6a10: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63  names */.  int c
6a20: 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  ntTab = 0;      
6a30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
6a40: 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65  ching table name
6a50: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
6a60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6a70: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
6a80: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
6a90: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
6aa0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  m;       /* Use 
6ab0: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  for looping over
6ac0: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20   pSrcList items 
6ad0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
6ae0: 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68  ist_item *pMatch
6af0: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61   = 0;  /* The ma
6b00: 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20  tching pSrcList 
6b10: 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  item */.  NameCo
6b20: 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20  ntext *pTopNC = 
6b30: 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  pNC;        /* F
6b40: 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74  irst namecontext
6b50: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
6b60: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75  .  assert( pColu
6b70: 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75  mnToken && pColu
6b80: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a  mnToken->z ); /*
6b90: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
6ba0: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
6bb0: 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65  /.  zDb = sqlite
6bc0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
6bd0: 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62  DbToken);.  zTab
6be0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6bf0: 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f  omToken(pTableTo
6c00: 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73  ken);.  zCol = s
6c10: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6c20: 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  ken(pColumnToken
6c30: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
6c40: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
6c50: 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75  {.    goto looku
6c60: 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  pname_end;.  }..
6c70: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6c80: 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70  = -1;.  while( p
6c90: 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a  NC && cnt==0 ){.
6ca0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
6cb0: 4c 69 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  List;.    SrcLis
6cc0: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
6cd0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20  C->pSrcList;..  
6ce0: 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29    if( pSrcList )
6cf0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c  {.      for(i=0,
6d00: 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d   pItem=pSrcList-
6d10: 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  >a; i<pSrcList->
6d20: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
6d30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  ++){.        Tab
6d40: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
6d50: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
6d60: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b     Column *pCol;
6d70: 0a 20 20 0a 20 20 20 20 20 20 20 20 70 54 61 62  .  .        pTab
6d80: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
6d90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6da0: 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20  pTab!=0 );.     
6db0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6dc0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
6dd0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
6de0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6df0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
6e00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54  ;.        if( zT
6e10: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
6e20: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
6e30: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
6e40: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
6e50: 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  = pItem->zAlias;
6e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6e70: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6e80: 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21  zTabName, zTab)!
6e90: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
6ea0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
6ec0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61   *zTabName = pTa
6ed0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
6ee0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
6ef0: 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  me==0 || sqlite3
6f00: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
6f10: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
6f20: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
6f30: 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26     if( zDb!=0 &&
6f40: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6f50: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
6f60: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
6f80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
6f90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
6fa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6fb0: 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61     if( 0==(cntTa
6fc0: 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  b++) ){.        
6fd0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6fe0: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
6ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
7000: 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61  r->pSchema = pTa
7010: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
7020: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
7030: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Item;.        }.
7040: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
7050: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
7060: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
7070: 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  j++, pCol++){.  
7080: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7090: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
70a0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
70b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
70c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
70d0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
70e0: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].zColl;.       
70f0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73       IdList *pUs
7100: 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ing;.           
7110: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
7120: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7130: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
7140: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
7150: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
7160: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7170: 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61  r->pSchema = pTa
7180: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
7190: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74          /* Subst
71a0: 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20  itute the rowid 
71b0: 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20  (column -1) for 
71c0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
71d0: 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20  ARY KEY */.     
71e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
71f0: 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d  olumn = j==pTab-
7200: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b  >iPKey ? -1 : j;
7210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
7220: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70  pr->affinity = p
7230: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
7240: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
7250: 20 20 20 69 66 28 20 28 70 45 78 70 72 2d 3e 66     if( (pExpr->f
7260: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
7270: 6c 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  late)==0 ){.    
7280: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7290: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
72a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
72b0: 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d  ENC(db), zColl,-
72c0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
72d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
72e0: 20 69 66 28 20 69 3c 70 53 72 63 4c 69 73 74 2d   if( i<pSrcList-
72f0: 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20  >nSrc-1 ){.     
7300: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
7310: 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[1].jointype &
7320: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7340: 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20  * If this match 
7350: 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68 65 20  occurred in the 
7360: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20  left table of a 
7370: 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20  natural join,.  
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
7390: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 72   then skip the r
73a0: 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20 61 76  ight table to av
73b0: 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20  oid a duplicate 
73c0: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
73d0: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b           pItem++
73e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
73f0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
7400: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
7410: 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d 5b 31  pUsing = pItem[1
7420: 5d 2e 70 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a  ].pUsing)!=0 ){.
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68  /* If this match
7450: 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c   occurs on a col
7460: 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74  umn that is in t
7470: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  he USING clause.
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b  ** of a join, sk
74a0: 69 70 20 74 68 65 20 73 65 61 72 63 68 20 6f 66  ip the search of
74b0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
74c0: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20   of the join.   
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
74e0: 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69  to avoid a dupli
74f0: 63 61 74 65 20 6d 61 74 63 68 20 74 68 65 72 65  cate match there
7500: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
7510: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
7520: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
7530: 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e  k=0; k<pUsing->n
7540: 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; k++){.      
7550: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
7560: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
7570: 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d  Using->a[k].zNam
7580: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20     pItem++;.    
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
75d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7600: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7610: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7620: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7630: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7640: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7650: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e     }.    }..#ifn
7660: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7670: 54 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49  TRIGGER.    /* I
7680: 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c  f we have not al
7690: 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74  ready resolved t
76a0: 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61  he name, then ma
76b0: 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69  ybe .    ** it i
76c0: 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  s a new.* or old
76d0: 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d  .* trigger argum
76e0: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20  ent reference.  
76f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62    */.    if( zDb
7700: 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26  ==0 && zTab!=0 &
7710: 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  & cnt==0 && pPar
7720: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30  se->trigStack!=0
7730: 20 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65   ){.      Trigge
7740: 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72  rStack *pTrigger
7750: 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e  Stack = pParse->
7760: 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20  trigStack;.     
7770: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
7780: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69  ;.      if( pTri
7790: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
77a0: 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74  x != -1 && sqlit
77b0: 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c  e3StrICmp("new",
77c0: 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20   zTab) == 0 ){. 
77d0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
77e0: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
77f0: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20  tack->newIdx;.  
7800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
7810: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
7820: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  b );.        pTa
7830: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
7840: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d  k->pTab;.      }
7850: 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65  else if( pTrigge
7860: 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21  rStack->oldIdx !
7870: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
7880: 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54  trICmp("old", zT
7890: 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ab)==0 ){.      
78a0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
78b0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
78c0: 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20  >oldIdx;.       
78d0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
78e0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a  rStack->pTab );.
78f0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
7900: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
7910: 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ab;.      }..   
7920: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a     if( pTab ){ .
7930: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
7940: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  ;.        Column
7950: 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *pCol = pTab->a
7960: 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70 45  Col;..        pE
7970: 78 70 72 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70  xpr->pSchema = p
7980: 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  Tab->pSchema;.  
7990: 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a        cntTab++;.
79a0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c          for(iCol
79b0: 3d 30 3b 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d  =0; iCol < pTab-
79c0: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70  >nCol; iCol++, p
79d0: 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  Col++) {.       
79e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
79f0: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
7a00: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
7a10: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
7a20: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
7a30: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7a40: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  zColl;.         
7a50: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
7a60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
7a70: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61  lumn = iCol==pTa
7a80: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
7a90: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  iCol;.          
7aa0: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
7ab0: 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  y = pTab->aCol[i
7ac0: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  Col].affinity;. 
7ad0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
7ae0: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
7af0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30  P_ExpCollate)==0
7b00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7b10: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
7b20: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
7b30: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
7b40: 20 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20   zColl,-1, 0);. 
7b50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7b60: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7b70: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
7b80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7b90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7bb0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
7bc0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7bd0: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a  IT_TRIGGER) */..
7be0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65      /*.    ** Pe
7bf0: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
7c00: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
7c10: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a   the ROWID.    *
7c20: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
7c30: 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26   && cntTab==1 &&
7c40: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
7c50: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63  zCol) ){.      c
7c60: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45  nt = 1;.      pE
7c70: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
7c80: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
7c90: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
7ca0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
7cb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
7cc0: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
7cd0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
7ce0: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
7cf0: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
7d00: 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68  me Z.    ** migh
7d10: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
7d20: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
7d30: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
7d40: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
7d50: 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72  .    ** we are r
7d60: 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69  esolving names i
7d70: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
7d80: 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
7d90: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20  ing command:.   
7da0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
7db0: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46  ELECT a+b AS x F
7dc0: 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20  ROM table WHERE 
7dd0: 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  x<10;.    **.   
7de0: 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b   ** In cases lik
7df0: 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20  e this, replace 
7e00: 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70  pExpr with a cop
7e10: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
7e20: 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ion that.    ** 
7e30: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
7e40: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
7e50: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
7e60: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
7e70: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
7e80: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
7e90: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
7ea0: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
7eb0: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
7ec0: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f  been.    ** reso
7ed0: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
7ee0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
7ef0: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
7f00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
7f10: 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20  t==0 && (pEList 
7f20: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d  = pNC->pEList)!=
7f30: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a  0 && zTab==0 ){.
7f40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
7f50: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7f60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
7f70: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
7f80: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
7f90: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
7fa0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
7fb0: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
7fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
7fd0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
7fe0: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
7ff0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
8000: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
8010: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
8020: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
8030: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
8040: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
8050: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8060: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
8070: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  pr);.          c
8080: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
8090: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
80a0: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
80b0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
80c0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a  okupname_end_2;.
80d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
80e0: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
80f0: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
8100: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
8110: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
8120: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
8130: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
8140: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
8150: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
8160: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
8170: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
8180: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
8190: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
81a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
81b0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
81c0: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
81d0: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
81e0: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
81f0: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
8200: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
8210: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
8220: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
8230: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
8240: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
8250: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
8260: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
8270: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
8280: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
8290: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
82a0: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
82b0: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
82c0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
82d0: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
82e0: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
82f0: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
8300: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
8310: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
8320: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
8330: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
8340: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
8350: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
8360: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
8370: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
8380: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
8390: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
83a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
83b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
83c0: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
83d0: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
83e0: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
83f0: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
8400: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
8410: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
8420: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
8430: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
8440: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72  t!=1 ){.    char
8450: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61   *z = 0;.    cha
8460: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72  r *zErr;.    zEr
8470: 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f  r = cnt==0 ? "no
8480: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73   such column: %s
8490: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
84a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b  olumn name: %s";
84b0: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
84c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
84d0: 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20  String(&z, zDb, 
84e0: 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ".", zTab, ".", 
84f0: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
8500: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
8510: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
8520: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
8530: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
8540: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
8550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
8560: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
8570: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
8580: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8590: 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a  (pParse, zErr, z
85a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
85b0: 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43  e(z);.    pTopNC
85c0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nErr++;.  }.. 
85d0: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
85e0: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20  from a table in 
85f0: 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65  pSrcList is refe
8600: 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63  renced, then rec
8610: 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ord.  ** this fa
8620: 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69  ct in the pSrcLi
8630: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62  st.a[].colUsed b
8640: 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20  itmask.  Column 
8650: 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69  0 causes.  ** bi
8660: 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20  t 0 to be set.  
8670: 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69  Column 1 sets bi
8680: 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  t 1.  And so for
8690: 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  th.  If the.  **
86a0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
86b0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
86c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
86d0: 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  s in the bitmask
86e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74  .  ** then set t
86f0: 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
8700: 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  t of the bitmask
8710: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
8720: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
8730: 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20  & pMatch!=0 ){. 
8740: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
8750: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->iColumn;.    i
8760: 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74  f( n>=sizeof(Bit
8770: 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20  mask)*8 ){.     
8780: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d   n = sizeof(Bitm
8790: 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a  ask)*8-1;.    }.
87a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74      assert( pMat
87b0: 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78  ch->iCursor==pEx
87c0: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
87d0: 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65    pMatch->colUse
87e0: 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31  d |= ((Bitmask)1
87f0: 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75  )<<n;.  }..looku
8800: 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20  pname_end:.  /* 
8810: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
8820: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
8830: 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71  eFree(zDb);.  sq
8840: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
8850: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8860: 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ete(pExpr->pLeft
8870: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  );.  pExpr->pLef
8880: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
8890: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
88a0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
88b0: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a  pr->pRight = 0;.
88c0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
88d0: 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e  _COLUMN;.lookupn
88e0: 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c  ame_end_2:.  sql
88f0: 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  iteFree(zCol);. 
8900: 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20   if( cnt==1 ){. 
8910: 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d     assert( pNC!=
8920: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
8930: 41 75 74 68 52 65 61 64 28 70 50 61 72 73 65 2c  AuthRead(pParse,
8940: 20 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72   pExpr, pNC->pSr
8950: 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  cList);.    if( 
8960: 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63  pMatch && !pMatc
8970: 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  h->pSelect ){.  
8980: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
8990: 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a  = pMatch->pTab;.
89a0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63      }.    /* Inc
89b0: 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20  rement the nRef 
89c0: 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d  value on all nam
89d0: 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20  e contexts from 
89e0: 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20  TopNC up to.    
89f0: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65  ** the point whe
8a00: 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63  re the name matc
8a10: 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hed. */.    for(
8a20: 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ;;){.      asser
8a30: 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a  t( pTopNC!=0 );.
8a40: 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52        pTopNC->nR
8a50: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ef++;.      if( 
8a60: 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72  pTopNC==pNC ) br
8a70: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  eak;.      pTopN
8a80: 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78  C = pTopNC->pNex
8a90: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
8aa0: 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 0;.  } else 
8ab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
8ac0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
8ad0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
8ae0: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
8af0: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
8b00: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  ee()..**.** Reso
8b10: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
8b20: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
8b30: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
8b40: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
8b50: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
8b60: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
8b70: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
8b80: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
8b90: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
8ba0: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
8bb0: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
8bc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
8bd0: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
8be0: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
8bf0: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
8c00: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
8c10: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
8c20: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
8c30: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
8c40: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
8c50: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
8c60: 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f  tic int nameReso
8c70: 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70  lverStep(void *p
8c80: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
8c90: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
8ca0: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
8cb0: 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 50 61  text*)pArg;.  Pa
8cc0: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20  rse *pParse;..  
8cd0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
8ce0: 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72  eturn 1;.  asser
8cf0: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70  t( pNC!=0 );.  p
8d00: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
8d10: 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  rse;..  if( Expr
8d20: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
8d30: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
8d40: 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  d) ) return 1;. 
8d50: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
8d60: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
8d70: 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ved);.#ifndef ND
8d80: 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e  EBUG.  if( pNC->
8d90: 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d  pSrcList && pNC-
8da0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >pSrcList->nAllo
8db0: 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  c>0 ){.    SrcLi
8dc0: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
8dd0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
8de0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
8df0: 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72  (i=0; i<pNC->pSr
8e00: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
8e10: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8e20: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
8e30: 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53  iCursor>=0 && pS
8e40: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
8e50: 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61  rsor<pParse->nTa
8e60: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  b);.    }.  }.#e
8e70: 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70  ndif.  switch( p
8e80: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
8e90: 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64  /* Double-quoted
8ea0: 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22 61   strings (ex: "a
8eb0: 62 63 22 29 20 61 72 65 20 75 73 65 64 20 61 73  bc") are used as
8ec0: 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66 0a   identifiers if.
8ed0: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
8ee0: 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79    Otherwise they
8ef0: 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69 6e   remain as strin
8f00: 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74  gs.  Single-quot
8f10: 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ed.    ** string
8f20: 73 20 28 65 78 3a 20 27 61 62 63 27 29 20 61 72  s (ex: 'abc') ar
8f30: 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67 20  e always string 
8f40: 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f  literals..    */
8f50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
8f60: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ING: {.      if(
8f70: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b   pExpr->token.z[
8f80: 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61 6b  0]=='\'' ) break
8f90: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
8fa0: 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b  thru into the TK
8fb0: 5f 49 44 20 63 61 73 65 20 69 66 20 74 68 69 73  _ID case if this
8fc0: 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f   is a double-quo
8fd0: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  ted string */.  
8fe0: 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e    }.    /* A lon
8ff0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
9000: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
9010: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
9020: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
9030: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
9040: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
9050: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43  Expr->token, pNC
9060: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
9070: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
9080: 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c    .    /* A tabl
9090: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
90a0: 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49  n name:     ID.I
90b0: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61  D.    ** Or a da
90c0: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
90d0: 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44  d column:  ID.ID
90e0: 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .ID.    */.    c
90f0: 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20  ase TK_DOT: {.  
9100: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75      Token *pColu
9110: 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  mn;.      Token 
9120: 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54  *pTable;.      T
9130: 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20  oken *pDb;.     
9140: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a   Expr *pRight;..
9150: 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72        /* if( pSr
9160: 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  cList==0 ) break
9170: 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68  ; */.      pRigh
9180: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
9190: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
91a0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
91b0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  {.        pDb = 
91c0: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  0;.        pTabl
91d0: 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  e = &pExpr->pLef
91e0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
91f0: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
9200: 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ght->token;.    
9210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9220: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
9230: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20  >op==TK_DOT );. 
9240: 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45         pDb = &pE
9250: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
9260: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  n;.        pTabl
9270: 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65  e = &pRight->pLe
9280: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
9290: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
92a0: 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  ight->pRight->to
92b0: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
92c0: 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50     lookupName(pP
92d0: 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c  arse, pDb, pTabl
92e0: 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c  e, pColumn, pNC,
92f0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72   pExpr);.      r
9300: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a  eturn 1;.    }..
9310: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66      /* Resolve f
9320: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20  unction names.  
9330: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
9340: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
9350: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
9360: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
9370: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
9380: 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  pr->pList;    /*
9390: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
93a0: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
93b0: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
93c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
93d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
93e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
93f0: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
9400: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
9410: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
9420: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
9430: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
9440: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
9450: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
9460: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
9470: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
9480: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94a0: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
94b0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
94c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
94d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b  .      int auth;
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74     /* Authorizat
9500: 69 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66  ion to use the f
9510: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
9520: 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9540: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
9550: 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ters in function
9560: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63   name */.      c
9570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
9580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9590: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
95a0: 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
95b0: 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
95c0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
95d0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
95e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
95f0: 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 70   int enc = ENC(p
9600: 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20  Parse->db);  /* 
9610: 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  The database enc
9620: 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20  oding */..      
9630: 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
9640: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
9650: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
9660: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
9670: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
9680: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
9690: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
96a0: 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  n, enc, 0);.    
96b0: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
96c0: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
96d0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
96e0: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
96f0: 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e  zId, nId, -1, en
9700: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  c, 0);.        i
9710: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
9720: 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f          no_such_
9730: 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  func = 1;.      
9740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9750: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67     wrong_num_arg
9760: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  s = 1;.        }
9770: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9780: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70        is_agg = p
9790: 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20  Def->xFunc==0;. 
97a0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
97b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
97c0: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69  RIZATION.      i
97d0: 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20  f( pDef ){.     
97e0: 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65     auth = sqlite
97f0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
9800: 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49  e, SQLITE_FUNCTI
9810: 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61  ON, 0, pDef->zNa
9820: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
9830: 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45  if( auth!=SQLITE
9840: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
9850: 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54   if( auth==SQLIT
9860: 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20  E_DENY ){.      
9870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9880: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
9890: 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f  ot authorized to
98a0: 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25   use function: %
98b0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e          pDef->zN
98e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
98f0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
9900: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9910: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
9920: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
9930: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9950: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
9960: 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d   is_agg && !pNC-
9970: 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20  >allowAgg ){.   
9980: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9990: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
99a0: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
99b0: 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  e function %.*s(
99c0: 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20  )", nId,zId);.  
99d0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
99e0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  +;.        is_ag
99f0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
9a00: 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66  se if( no_such_f
9a10: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
9a20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9a30: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
9a40: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
9a50: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
9a60: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
9a70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9a80: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
9a90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9aa0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9ab0: 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  e,"wrong number 
9ac0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
9ad0: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
9ae0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  ,.             n
9af0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
9b00: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
9b10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9b20: 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20   is_agg ){.     
9b30: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
9b40: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a  K_AGG_FUNCTION;.
9b50: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73          pNC->has
9b60: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Agg = 1;.      }
9b70: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
9b80: 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67  g ) pNC->allowAg
9b90: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  g = 0;.      for
9ba0: 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d  (i=0; pNC->nErr=
9bb0: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
9bc0: 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70  .        walkExp
9bd0: 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  rTree(pList->a[i
9be0: 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73  ].pExpr, nameRes
9bf0: 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b  olverStep, pNC);
9c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9c10: 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d  f( is_agg ) pNC-
9c20: 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20  >allowAgg = 1;. 
9c30: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20       /* FIX ME: 
9c40: 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e   Compute pExpr->
9c50: 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f  affinity based o
9c60: 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  n the expected r
9c70: 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74  eturn.      ** t
9c80: 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ype of the funct
9c90: 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion .      */.  
9ca0: 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67      return is_ag
9cb0: 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  g;.    }.#ifndef
9cc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
9cd0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
9ce0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
9cf0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65  se TK_EXISTS:.#e
9d00: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
9d10: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
9d20: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
9d30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
9d40: 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  Ref = pNC->nRef;
9d50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9d60: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 20  OMIT_CHECK.     
9d70: 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68     if( pNC->isCh
9d80: 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eck ){.         
9d90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9da0: 28 70 50 61 72 73 65 2c 22 73 75 62 71 75 65 72  (pParse,"subquer
9db0: 69 65 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ies prohibited i
9dc0: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
9dd0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  nts");.        }
9de0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
9df0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
9e00: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45 78  olve(pParse, pEx
9e10: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43  pr->pSelect, pNC
9e20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9e30: 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52  t( pNC->nRef>=nR
9e40: 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ef );.        if
9e50: 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65  ( nRef!=pNC->nRe
9e60: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  f ){.          E
9e70: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
9e80: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
9e90: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
9ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9eb0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
9ec0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
9ed0: 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ECK.    case TK_
9ee0: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
9ef0: 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65    if( pNC->isChe
9f00: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
9f10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9f20: 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73  arse,"parameters
9f30: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
9f40: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
9f50: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
9f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9f70: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
9f80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
9f90: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
9fa0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
9fb0: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
9fc0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
9fd0: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
9fe0: 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20  .  Nodes of the 
9ff0: 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44  form ID.ID or ID
a000: 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e   resolve into an
a010: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65  .** index to the
a020: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
a030: 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63  ble list and a c
a040: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54  olumn offset.  T
a050: 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f  he .** Expr.opco
a060: 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65  de for such node
a070: 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  s is changed to 
a080: 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20  TK_COLUMN.  The 
a090: 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76  Expr.iTable.** v
a0a0: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
a0b0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
a0c0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
a0d0: 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
a0e0: 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61  .** plus the "ba
a0f0: 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20  se" value.  The 
a100: 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20  base value will 
a110: 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d  ultimately becom
a120: 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75  e the.** VDBE cu
a130: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
a140: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
a150: 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74   pointing into t
a160: 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  he referenced.**
a170: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
a180: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
a190: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
a1a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
a1b0: 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65  olumn .** of the
a1c0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
a1d0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
a1e0: 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  lumn value for t
a1f0: 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f  he special.** RO
a200: 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31  WID column is -1
a210: 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50  .  Any INTEGER P
a220: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
a230: 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e  n is tried as an
a240: 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f  .** alias for RO
a250: 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  WID..**.** Also 
a260: 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  resolve function
a270: 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b   names and check
a280: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66   the functions f
a290: 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61  or proper.** usa
a2a0: 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61  ge.  Make sure a
a2b0: 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ll function name
a2c0: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
a2d0: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
a2e0: 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63  ns.** have the c
a2f0: 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
a300: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
a310: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
a320: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
a330: 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79  ->zErrMsg if any
a340: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
a350: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
a360: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
a370: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
a380: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
a390: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
a3a0: 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  ns then set the 
a3b0: 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72  EP_Agg.** proper
a3c0: 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ty on the expres
a3d0: 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sion..*/.int sql
a3e0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
a3f0: 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  ames(.  NameCont
a400: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20  ext *pNC,       
a410: 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20  /* Namespace to 
a420: 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69  resolve expressi
a430: 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70  ons in. */.  Exp
a440: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
a450: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
a460: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
a470: 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69  lyzed. */.){.  i
a480: 6e 74 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a  nt savedHasAgg;.
a490: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
a4a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 61 76   return 0;.  sav
a4b0: 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e  edHasAgg = pNC->
a4c0: 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68  hasAgg;.  pNC->h
a4d0: 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c  asAgg = 0;.  wal
a4e0: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c  kExprTree(pExpr,
a4f0: 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65   nameResolverSte
a500: 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28 20 70  p, pNC);.  if( p
a510: 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  NC->nErr>0 ){.  
a520: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
a530: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
a540: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  r);.  }.  if( pN
a550: 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20 20 20  C->hasAgg ){.   
a560: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
a570: 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b  (pExpr, EP_Agg);
a580: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76  .  }else if( sav
a590: 65 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20  edHasAgg ){.    
a5a0: 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b  pNC->hasAgg = 1;
a5b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78  .  }.  return Ex
a5c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a5d0: 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a  xpr, EP_Error);.
a5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  }../*.** A point
a5f0: 65 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  er instance of t
a600: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
a610: 20 75 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e   used to pass in
a620: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72  formation.** thr
a630: 6f 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65  ough walkExprTre
a640: 65 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75  e into codeSubqu
a650: 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79  eryStep()..*/.ty
a660: 70 65 64 65 66 20 73 74 72 75 63 74 20 51 75 65  pedef struct Que
a670: 72 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64  ryCoder QueryCod
a680: 65 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79  er;.struct Query
a690: 43 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20  Coder {.  Parse 
a6a0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f  *pParse;       /
a6b0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
a6c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  ntext */.  NameC
a6d0: 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20  ontext *pNC;    
a6e0: 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20  /* Namespace of 
a6f0: 66 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20  first enclosing 
a700: 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a  query */.};.../*
a710: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
a720: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
a730: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
a740: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
a750: 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72   and IN operator
a760: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
a770: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
a780: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
a790: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
a7a0: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
a7b0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
a7c0: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
a7d0: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
a7e0: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
a7f0: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
a800: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
a810: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
a820: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
a830: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
a840: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
a850: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
a860: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
a870: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
a880: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
a890: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
a8a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
a8b0: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
a8c0: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
a8d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
a8e0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76  _OMIT_SUBQUERY.v
a8f0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53  oid sqlite3CodeS
a900: 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a  ubselect(Parse *
a910: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
a920: 78 70 72 29 7b 0a 20 20 69 6e 74 20 74 65 73 74  xpr){.  int test
a930: 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Addr = 0;       
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74  /* One-time test
a960: 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64   address */.  Vd
a970: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
a980: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a990: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
a9a0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  urn;..  /* This 
a9b0: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
a9c0: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
a9d0: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
a9e0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
a9f0: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
aa00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
aa10: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
aa20: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
aa30: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
aa40: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
aa50: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
aa60: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
aa70: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
aa80: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
aa90: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
aaa0: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
aab0: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
aac0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
aad0: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
aae0: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
aaf0: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
ab00: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
ab10: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
ab20: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
ab30: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
ab40: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
ab50: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
ab60: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
ab70: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
ab80: 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21 70  VarSelect) && !p
ab90: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
aba0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20   ){.    int mem 
abb0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
abc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
abd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
abe0: 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20  Load, mem, 0);. 
abf0: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71     testAddr = sq
ac00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ac10: 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a  , OP_If, 0, 0);.
ac20: 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73 74      assert( test
ac30: 41 64 64 72 3e 30 20 7c 7c 20 73 71 6c 69 74 65  Addr>0 || sqlite
ac40: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
ac50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ac60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
ac70: 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20  mInt, 1, mem);. 
ac80: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
ac90: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
aca0: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
acb0: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
acc0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
acd0: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
ace0: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
acf0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
ad00: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
ad10: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
ad20: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
ad30: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
ad40: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
ad50: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
ad60: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
ad70: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
ad80: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
ad90: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
ada0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
adb0: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
adc0: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72   same way. A vir
add0: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  tual table is . 
ade0: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
adf0: 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
ae00: 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
ae10: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
ae20: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
ae30: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
ae40: 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
ae50: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
ae60: 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
ae70: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
ae80: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
ae90: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
aea0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
aeb0: 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
aec0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
aed0: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
aee0: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
aef0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
af00: 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
af10: 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
af20: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
af30: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
af40: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
af50: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
af60: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
af70: 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
af80: 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
af90: 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
afa0: 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
afb0: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
afc0: 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
afd0: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
afe0: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
aff0: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
b000: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
b010: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
b020: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
b030: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
b040: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
b050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b060: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
b070: 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
b080: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65  le, 0);.      me
b090: 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30  mset(&keyInfo, 0
b0a0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f  , sizeof(keyInfo
b0b0: 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66  ));.      keyInf
b0c0: 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20  o.nField = 1;.  
b0d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b0e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
b0f0: 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d  mColumns, pExpr-
b100: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20  >iTable, 1);..  
b110: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
b120: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
b130: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
b140: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
b150: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
b160: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
b170: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
b180: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
b190: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
b1a0: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
b1b0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
b1c0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
b1d0: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
b1e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
b1f0: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70  int iParm = pExp
b200: 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28  r->iTable +  (((
b210: 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31  int)affinity)<<1
b220: 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  6);.        Expr
b230: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
b240: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
b250: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
b260: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
b270: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
b280: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
b290: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
b2a0: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
b2b0: 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _Set, iParm, 0, 
b2c0: 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0, 0, 0) ){.    
b2d0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b2f0: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
b300: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
b310: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c  .        if( pEL
b320: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
b330: 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20  Expr>0 ){ .     
b340: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
b350: 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f  ll[0] = binaryCo
b360: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
b370: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b380: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
b390: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
b3a0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
b3b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b3c0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
b3d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
b3e0: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
b3f0: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
b400: 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63    **..** For eac
b410: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
b420: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
b430: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
b440: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
b450: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
b460: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
b470: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
b480: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
b490: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
b4a0: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
b4b0: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
b4c0: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
b4d0: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
b4e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
b4f0: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
b500: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
b510: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
b520: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
b530: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
b540: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
b550: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
b560: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
b570: 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  m;..        if( 
b580: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
b590: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
b5a0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
b5b0: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
b5c0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
b5d0: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
b5e0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
b5f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
b600: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
b610: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
b620: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
b630: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
b640: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
b650: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
b660: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
b670: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
b680: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
b690: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
b6a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
b6b0: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
b6c0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
b6d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
b6e0: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
b6f0: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
b700: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
b710: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
b720: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
b730: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
b740: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
b750: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
b760: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
b770: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
b780: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
b790: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
b7a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b7b0: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
b7c0: 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  >0 && !sqlite3Ex
b7d0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
b7e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
b7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
b800: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
b810: 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20  Addr-1, 3);.    
b820: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
b830: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
b840: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
b850: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
b860: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
b870: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
b880: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
b890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b8a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b8b0: 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  E2);.          s
b8c0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
b8d0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
b8e0: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
b8f0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
b900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b910: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
b920: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
b930: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
b940: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
b960: 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
b970: 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )&keyInfo, P3_KE
b980: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72  YINFO);.      br
b990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
b9a0: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
b9b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
b9c0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
b9d0: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
b9e0: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
b9f0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
ba00: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
ba10: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
ba20: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
ba30: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
ba40: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
ba50: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
ba60: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
ba70: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
ba80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
ba90: 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20  t Token one = { 
baa0: 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d  (u8*)"1", 0, 1 }
bab0: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
bac0: 70 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  pSel;.      int 
bad0: 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  iMem;.      int 
bae0: 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70  sop;..      pExp
baf0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65  r->iColumn = iMe
bb00: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
bb10: 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  ++;.      pSel =
bb20: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
bb30: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
bb40: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
bb50: 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d  ){.        sop =
bb60: 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
bb70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bb80: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
bb90: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
bba0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
bbb0: 28 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71  (v, "# Init subq
bbc0: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
bbd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bbe0: 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45       sop = SRT_E
bbf0: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
bc00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bc10: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
bc20: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   iMem);.        
bc30: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
bc40: 22 23 20 49 6e 69 74 20 45 58 49 53 54 53 20 72  "# Init EXISTS r
bc50: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
bc60: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
bc70: 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  xprDelete(pSel->
bc80: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
bc90: 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
bca0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54  lite3Expr(TK_INT
bcb0: 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65  EGER, 0, 0, &one
bcc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
bcd0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
bce0: 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d  e, pSel, sop, iM
bcf0: 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20  em, 0, 0, 0, 0) 
bd00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
bd10: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
bd20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bd30: 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
bd40: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
bd50: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bd60: 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20  testAddr);.  }. 
bd70: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
bd80: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
bd90: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
bda0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
bdb0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
bdc0: 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
bdd0: 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
bde0: 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
bdf0: 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  -1] on the stack
be00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
be10: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62   codeInteger(Vdb
be20: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
be30: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
be40: 6e 74 20 69 3b 0a 20 20 69 66 28 20 73 71 6c 69  nt i;.  if( sqli
be50: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26  te3GetInt32(z, &
be60: 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i) ){.    sqlite
be70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
be80: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
be90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
bea0: 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73  ite3FitsIn64Bits
beb0: 28 7a 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (z) ){.    sqlit
bec0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
bed0: 49 6e 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20  Int64, 0, 0, z, 
bee0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
bef0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
bf00: 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30  v, OP_Real, 0, 0
bf10: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  , z, n);.  }.}..
bf20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bf30: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
bf40: 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
bf50: 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
bf60: 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
bf70: 61 6e 64 20 70 75 73 68 20 74 68 61 74 20 63 6f  and push that co
bf80: 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 6e 20 74 68  lumn value on th
bf90: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 72 65 0a  e stack.  There.
bfa0: 2a 2a 20 69 73 20 61 6e 20 6f 70 65 6e 20 63 75  ** is an open cu
bfb0: 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20  rsor to pTab in 
bfc0: 69 54 61 62 6c 65 2e 20 20 49 66 20 69 43 6f 6c  iTable.  If iCol
bfd0: 75 6d 6e 3c 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  umn<0 then.** co
bfe0: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
bff0: 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
c000: 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64  e rowid..*/.void
c010: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c020: 47 65 74 43 6f 6c 75 6d 6e 28 56 64 62 65 20 2a  GetColumn(Vdbe *
c030: 76 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  v, Table *pTab, 
c040: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 6e 74  int iColumn, int
c050: 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66 28 20   iTable){.  if( 
c060: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
c070: 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20   int op = (pTab 
c080: 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  && IsVirtual(pTa
c090: 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20  b)) ? OP_VRowid 
c0a0: 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20  : OP_Rowid;.    
c0b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c0c0: 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20  (v, op, iTable, 
c0d0: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
c0e0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pTab==0 ){.    s
c0f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c100: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
c110: 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a  able, iColumn);.
c120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
c130: 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28   op = IsVirtual(
c140: 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75  pTab) ? OP_VColu
c150: 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a  mn : OP_Column;.
c160: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c170: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54 61 62  ddOp(v, op, iTab
c180: 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  le, iColumn);.  
c190: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
c1a0: 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
c1b0: 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65  iColumn);.#ifnde
c1c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
c1d0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
c1e0: 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
c1f0: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
c200: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
c210: 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL ){.      sqli
c220: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c230: 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
c240: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   0, 0);.    }.#e
c250: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
c260: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c270: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
c280: 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
c290: 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
c2a0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
c2b0: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
c2c0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61  n the top of sta
c2d0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ck..**.** This c
c2e0: 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
c2f0: 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
c300: 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
c310: 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
c320: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
c330: 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
c340: 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
c350: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
c360: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
c370: 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
c380: 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
c390: 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
c3a0: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
c3b0: 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
c3c0: 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
c3d0: 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
c3e0: 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
c3f0: 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
c400: 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
c410: 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
c420: 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
c430: 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
c440: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
c450: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
c460: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62  r *pExpr){.  Vdb
c470: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
c480: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a  Vdbe;.  int op;.
c490: 20 20 69 6e 74 20 73 74 61 63 6b 43 68 6e 67 20    int stackChng 
c4a0: 3d 20 31 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  = 1;    /* Amoun
c4b0: 74 20 6f 66 20 63 68 61 6e 67 65 20 74 6f 20 73  t of change to s
c4c0: 74 61 63 6b 20 64 65 70 74 68 20 2a 2f 0a 0a 20  tack depth */.. 
c4d0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
c4e0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  rn;.  if( pExpr=
c4f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c500: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c510: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
c520: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
c530: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
c540: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
c550: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
c560: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
c570: 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
c580: 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
c590: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
c5a0: 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
c5b0: 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
c5c0: 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
c5d0: 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
c5e0: 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
c5f0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ode ){.        s
c600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c610: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
c620: 43 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20  Col->iMem, 0);. 
c630: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c640: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
c650: 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
c660: 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
c670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c680: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
c690: 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
c6a0: 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20  gIdx,.          
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
c6d0: 72 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  rColumn);.      
c6e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
c6f0: 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
c700: 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
c710: 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
c720: 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
c730: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
c740: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
c750: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
c760: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
c770: 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
c780: 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63  when coding chec
c790: 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  k constraints */
c7a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c7b0: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
c7c0: 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  t>0 );.        s
c7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c7e0: 76 2c 20 4f 50 5f 44 75 70 2c 20 70 50 61 72 73  v, OP_Dup, pPars
c7f0: 65 2d 3e 63 6b 4f 66 66 73 65 74 2d 70 45 78 70  e->ckOffset-pExp
c800: 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31 29  r->iColumn-1, 1)
c810: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c830: 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
c840: 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  v, pExpr->pTab, 
c850: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
c860: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
c870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c880: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c890: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
c8a0: 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
c8b0: 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29 70 45  ger(v, (char*)pE
c8c0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
c8d0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
c8e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c8f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
c900: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
c910: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
c920: 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41   assert( TK_FLOA
c930: 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20  T==OP_Real );.  
c940: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
c950: 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67  TRING==OP_String
c960: 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 );.      sqlit
c970: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 45  e3DequoteExpr(pE
c980: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
c990: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70  te3VdbeOp3(v, op
c9a0: 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 70  , 0, 0, (char*)p
c9b0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
c9c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
c9d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c9e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
c9f0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
ca00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ca10: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
ca20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ca30: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ca40: 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
ca50: 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
ca60: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
ca70: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
ca80: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
ca90: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42   assert( TK_BLOB
caa0: 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a  ==OP_HexBlob );.
cab0: 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72 2d        n = pExpr-
cac0: 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20  >token.n - 3;.  
cad0: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70      z = (char*)p
cae0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20  Expr->token.z + 
caf0: 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  2;.      assert(
cb00: 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69   n>=0 );.      i
cb10: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
cb20: 20 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20     z = "";.     
cb30: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
cb40: 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30  VdbeOp3(v, op, 0
cb50: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  , 0, z, n);.    
cb60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
cb70: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
cb80: 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
cb90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cba0: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61  ddOp(v, OP_Varia
cbb0: 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ble, pExpr->iTab
cbc0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
cbd0: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
cbe0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
cbf0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
cc00: 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  3(v, -1, (char*)
cc10: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
cc20: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
cc30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
cc40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cc50: 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
cc60: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
cc70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cc80: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d  _MemLoad, pExpr-
cc90: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
cca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ccb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ccc0: 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
ccd0: 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
cce0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
ccf0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
cd00: 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
cd10: 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
cd20: 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20  nt aff, to_op;. 
cd30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cd40: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
cd50: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
cd60: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41    aff = sqlite3A
cd70: 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45 78  ffinityType(&pEx
cd80: 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pr->token);.    
cd90: 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20    to_op = aff - 
cda0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
cdb0: 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20  + OP_ToText;.   
cdc0: 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
cdd0: 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20 7c  ==OP_ToText    |
cde0: 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
cdf0: 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20 20  F_TEXT    );.   
ce00: 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
ce10: 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c  ==OP_ToBlob    |
ce20: 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
ce30: 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20  F_NONE    );.   
ce40: 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
ce50: 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c  ==OP_ToNumeric |
ce60: 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
ce70: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
ce80: 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
ce90: 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c  ==OP_ToInt     |
cea0: 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
ceb0: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
cec0: 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f 70     assert( to_op
ced0: 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c  ==OP_ToReal    |
cee0: 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46  | aff!=SQLITE_AF
cef0: 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20 20  F_REAL    );.   
cf00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf10: 64 4f 70 28 76 2c 20 74 6f 5f 6f 70 2c 20 30 2c  dOp(v, to_op, 0,
cf20: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
cf30: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
cf40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
cf50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
cf60: 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
cf70: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
cf80: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
cf90: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
cfa0: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
cfb0: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
cfc0: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
cfd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
cfe0: 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
cff0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
d000: 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
d010: 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
d020: 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
d030: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
d040: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
d050: 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
d060: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d070: 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
d080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d090: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d0a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
d0b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d0c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
d0d0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
d0e0: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
d0f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d100: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
d110: 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  t, op, 0, 0);.  
d120: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
d130: 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
d140: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d150: 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
d160: 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
d170: 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
d180: 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
d190: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
d1a0: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
d1b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
d1c0: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
d1d0: 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
d1e0: 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
d1f0: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
d200: 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
d210: 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
d220: 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
d230: 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
d240: 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  P_And );.      a
d250: 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
d260: 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Or );.      ass
d270: 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
d280: 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _Add );.      as
d290: 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
d2a0: 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20  OP_Subtract );. 
d2b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
d2c0: 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
d2d0: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
d2e0: 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
d2f0: 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20  _BitAnd );.     
d300: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
d310: 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20  R==OP_BitOr );. 
d320: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
d330: 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
d340: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
d350: 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
d360: 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20  ShiftLeft );.   
d370: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
d380: 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
d390: 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ght );.      ass
d3a0: 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
d3b0: 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20  OP_Concat );.   
d3c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d3d0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
d3e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
d3f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d400: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d410: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71  Right);.      sq
d420: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d430: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
d440: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d     stackChng = -
d450: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
d460: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d470: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
d480: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
d490: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
d4a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
d4b0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
d4c0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
d4d0: 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d  AT || pLeft->op=
d4e0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
d4f0: 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20         Token *p 
d500: 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  = &pLeft->token;
d510: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
d520: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
d530: 66 28 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c  f("-%.*s", p->n,
d540: 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20   p->z);.        
d550: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
d560: 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
d570: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d580: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  Op3(v, OP_Real, 
d590: 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  0, 0, z, p->n+1)
d5a0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d5b0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49  .          codeI
d5c0: 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e  nteger(v, z, p->
d5d0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n+1);.        }.
d5e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
d5f0: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62  ee(z);.        b
d600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d610: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
d620: 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20  ugh into TK_NOT 
d630: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
d640: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
d650: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
d660: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
d670: 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
d680: 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ot );.      asse
d690: 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
d6a0: 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ot );.      sqli
d6b0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d6c0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d6d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d6e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
d6f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74   0, 0);.      st
d700: 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
d710: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d720: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
d730: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
d740: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
d750: 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20   int dest;.     
d760: 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
d770: 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
d780: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d790: 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
d7a0: 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73  tNull );.      s
d7b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d7c0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
d7d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
d7e0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d7f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d800: 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20  );.      dest = 
d810: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d820: 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20  ntAddr(v) + 2;. 
d830: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d840: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
d850: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
d860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d870: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
d880: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
d890: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
d8a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d8b0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
d8c0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  TION: {.      Ag
d8d0: 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  gInfo *pInfo = p
d8e0: 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
d8f0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d        if( pInfo=
d900: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
d910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d920: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
d930: 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22 2c   aggregate: %T",
d940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70 45  .            &pE
d950: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
d960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d980: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
d990: 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
d9a0: 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c  xpr->iAgg].iMem,
d9b0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d9c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d9d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53      case TK_CONS
d9e0: 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65  T_FUNC:.    case
d9f0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
da00: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
da10: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
da20: 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  List;.      int 
da30: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20  nExpr = pList ? 
da40: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
da50: 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  ;.      FuncDef 
da60: 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74  *pDef;.      int
da70: 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73   nId;.      cons
da80: 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20  t char *zId;.   
da90: 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b     int constMask
daa0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
dab0: 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  i;.      u8 enc 
dac0: 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
dad0: 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  );.      CollSeq
dae0: 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
daf0: 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29     zId = (char*)
db00: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
db10: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
db20: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
db30: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
db40: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
db50: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
db60: 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30  d, nExpr, enc, 0
db70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
db80: 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20   pDef!=0 );.    
db90: 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65    nExpr = sqlite
dba0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
dbb0: 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29  t(pParse, pList)
dbc0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
dbd0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
dbe0: 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
dbf0: 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
dc00: 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
dc10: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
dc20: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
dc30: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
dc40: 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
dc50: 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
dc60: 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
dc70: 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
dc80: 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
dc90: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
dca0: 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
dcb0: 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
dcc0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
dcd0: 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
dce0: 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
dcf0: 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
dd00: 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
dd10: 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
dd20: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
dd30: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
dd40: 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
dd50: 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
dd60: 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
dd70: 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
dd80: 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
dd90: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
dda0: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
ddb0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
ddc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
ddd0: 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
dde0: 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
ddf0: 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
de00: 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
de10: 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
de20: 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
de30: 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
de40: 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
de50: 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
de60: 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
de70: 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
de80: 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32 20     if( nExpr>=2 
de90: 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
dea0: 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
deb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
dec0: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
ded0: 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 70  erloadFunction(p
dee0: 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73  Def, nExpr, pLis
def0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
df00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
df10: 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20 20  nExpr>0 ){.     
df20: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
df30: 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
df40: 63 74 69 6f 6e 28 70 44 65 66 2c 20 6e 45 78 70  ction(pDef, nExp
df50: 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r, pList->a[0].p
df60: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
df70: 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
df80: 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
df90: 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<32; i++){.    
dfa0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
dfb0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c  xprIsConstant(pL
dfc0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
dfd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
dfe0: 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69  nstMask |= (1<<i
dff0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e000: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
e010: 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70  eedCollSeq && !p
e020: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
e030: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
e040: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
e050: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
e060: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
e070: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
e080: 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
e090: 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
e0a0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
e0b0: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
e0c0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
e0d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e0e0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c  beOp3(v, OP_Coll
e0f0: 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Seq, 0, 0, (char
e100: 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c   *)pColl, P3_COL
e110: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
e120: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e130: 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op3(v, OP_Functi
e140: 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e  on, constMask, n
e150: 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44 65  Expr, (char*)pDe
e160: 66 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P3_FUNCDEF);.
e170: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
e180: 3d 20 31 2d 6e 45 78 70 72 3b 0a 20 20 20 20 20  = 1-nExpr;.     
e190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
e1a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e1b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
e1c0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
e1d0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
e1e0: 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  T: {.      if( p
e1f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30  Expr->iColumn==0
e200: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e210: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
e220: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
e230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e250: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
e260: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
e270: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
e280: 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61 64  ment((v, "# load
e290: 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
e2a0: 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  "));.      break
e2b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e2c0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
e2d0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
e2e0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
e2f0: 20 20 20 20 20 69 6e 74 20 63 6b 4f 66 66 73 65       int ckOffse
e300: 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  t = pParse->ckOf
e310: 66 73 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  fset;.      sqli
e320: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
e330: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
e340: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72  ..      /* Figur
e350: 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69  e out the affini
e360: 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65  ty to use to cre
e370: 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74  ate a key from t
e380: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
e390: 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65   ** of the expre
e3a0: 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53  ssion. affinityS
e3b0: 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74  tr stores a stat
e3c0: 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62  ic string suitab
e3d0: 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  le for.      ** 
e3e0: 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63  P3 of OP_MakeRec
e3f0: 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ord..      */.  
e400: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63      affinity = c
e410: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
e420: 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  y(pExpr);..     
e430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e440: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
e450: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
e460: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d  arse->ckOffset =
e470: 20 63 6b 4f 66 66 73 65 74 2b 31 3b 0a 0a 20 20   ckOffset+1;..  
e480: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
e490: 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
e4a0: 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54  pr> IN (...)". T
e4b0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
e4c0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70  le.      ** pExp
e4d0: 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69  r->iTable contai
e4e0: 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
e4f0: 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28  at make up the (
e500: 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20  ...) set..      
e510: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
e520: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e530: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
e540: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
e550: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e560: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
e570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e580: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
e590: 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20 20  , addr+4);      
e5a0: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
e5b0: 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  0 */.      sqlit
e5c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e5d0: 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20  P_Pop, 2, 0);.  
e5e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e5f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
e600: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
e610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e620: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
e630: 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+7);.      sql
e640: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
e650: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
e660: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
e670: 29 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 34  );   /* addr + 4
e680: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
e690: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e6a0: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
e6b0: 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a  Table, addr+7);.
e6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e6d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
e6e0: 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20  Imm, -1, 0);    
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e700: 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20   addr + 6 */..  
e710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e720: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
e730: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
e740: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
e750: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
e760: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
e770: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49  prList_item *pLI
e780: 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  tem = pExpr->pLi
e790: 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
e7a0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
e7b0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
e7c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e7d0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
e7e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e7f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
e800: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
e810: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e820: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
e830: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
e840: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
e850: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
e860: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
e870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e880: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
e890: 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b  ;.      pLItem++
e8a0: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
e8b0: 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
e8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e8d0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
e8e0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
e8f0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
e900: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
e910: 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_Le, 0, 0);.  
e920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e930: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  ddOp(v, OP_And, 
e940: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
e950: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e960: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20  se TK_UPLUS:.   
e970: 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20   case TK_AS: {. 
e980: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e990: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
e9a0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
e9b0: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
e9c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e9d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e9e0: 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
e9f0: 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  t expr_end_label
ea00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70  ;.      int jump
ea10: 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Inst;.      int 
ea20: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
ea30: 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   i;.      ExprLi
ea40: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
ea50: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ea60: 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
ea70: 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  m;..      assert
ea80: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  (pExpr->pList);.
ea90: 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
eaa0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
eab0: 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
eac0: 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
ead0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  ->pList->nExpr >
eae0: 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
eaf0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
eb00: 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
eb10: 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
eb20: 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
eb30: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
eb40: 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c    expr_end_label
eb50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
eb60: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
eb70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
eb80: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
eb90: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
eba0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ebb0: 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ft);.      }.   
ebc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
ebd0: 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
ebe0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ebf0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
ec00: 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29  stelem[i].pExpr)
ec10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
ec20: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
ec30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ec40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
ec50: 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  up, 1, 1);.     
ec60: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
ec70: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
ec80: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ec90: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
eca0: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c         OP_Ne, 0,
ecd0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
ece0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ecf0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
ed00: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ed10: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
ed20: 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
ed30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
ed40: 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 1, 0);.     
ed50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
ed60: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ed70: 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
ed80: 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +1].pExpr);.    
ed90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eda0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
edb0: 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
edc0: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  el);.        sql
edd0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ede0: 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20  (v, jumpInst);. 
edf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ee00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
ee10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ee20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ee30: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
ee40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
ee50: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
ee60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ee70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ee80: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ee90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eeb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
eec0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
eed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eee0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
eef0: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
ef00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ef10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ef20: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
ef30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
ef40: 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  SE: {.      if( 
ef50: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
ef60: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
ef70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ef80: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
efa0: 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
efb0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
efc0: 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
efd0: 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  );..return;.    
efe0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
eff0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45  xpr->iColumn!=OE
f000: 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
f010: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
f020: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52  r->iColumn==OE_R
f030: 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20  ollback ||.     
f040: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
f050: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
f060: 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20  _Abort ||.      
f070: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
f080: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
f090: 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Fail );.        
f0a0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
f0b0: 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  xpr(pExpr);.    
f0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f0d0: 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op3(v, OP_Halt, 
f0e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
f0f0: 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  T, pExpr->iColum
f100: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
f110: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
f120: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
f130: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
f140: 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  );.      } else 
f150: 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
f160: 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  t( pExpr->iColum
f170: 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29  n == OE_Ignore )
f180: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
f190: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f1a0: 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c  P_ContextPop, 0,
f1b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71   0);.         sq
f1c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f1d0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50  , OP_Goto, 0, pP
f1e0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d  arse->trigStack-
f1f0: 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20  >ignoreJump);.  
f200: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
f210: 6e 74 28 28 76 2c 20 22 23 20 72 61 69 73 65 28  nt((v, "# raise(
f220: 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20  IGNORE)"));.    
f230: 20 20 7d 0a 20 20 20 20 20 20 73 74 61 63 6b 43    }.      stackC
f240: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
f250: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
f260: 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  if.  }..  if( pP
f270: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29  arse->ckOffset )
f280: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b  {.    pParse->ck
f290: 4f 66 66 73 65 74 20 2b 3d 20 73 74 61 63 6b 43  Offset += stackC
f2a0: 68 6e 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  hng;.    assert(
f2b0: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
f2c0: 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  t );.  }.}..#ifn
f2d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f2e0: 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65  TRIGGER./*.** Ge
f2f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f300: 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
f310: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
f320: 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65  nd leaves the re
f330: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  sult.** on the s
f340: 74 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20  tack.  See also 
f350: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f360: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
f370: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
f380: 20 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c   cache the resul
f390: 74 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  t and modify the
f3a0: 20 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73   pExpr tree.** s
f3b0: 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d  o that it will m
f3c0: 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63  ake use of the c
f3d0: 61 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20  ached result on 
f3e0: 73 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75  subsequent evalu
f3f0: 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72  ations.** rather
f400: 20 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74   than evaluate t
f410: 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73  he whole express
f420: 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76  ion again.  Triv
f430: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ial expressions 
f440: 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65  are.** not cache
f450: 64 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  d.  If the expre
f460: 73 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c  ssion is cached,
f470: 20 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73   its result is s
f480: 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d  tored in a .** m
f490: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
f4a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
f4b0: 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
f4c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
f4d0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
f4e0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
f4f0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
f500: 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  em;.  int addr1,
f510: 20 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d   addr2;.  if( v=
f520: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
f530: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
f540: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f550: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
f560: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
f570: 72 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71  r);.  addr2 = sq
f580: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f590: 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61  Addr(v);.  if( a
f5a0: 64 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20  ddr2>addr1+1 || 
f5b0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
f5c0: 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f  (v, addr1)->opco
f5d0: 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  de==OP_Function 
f5e0: 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45  ){.    iMem = pE
f5f0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
f600: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
f610: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f620: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
f630: 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  e, iMem, 0);.   
f640: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
f650: 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a  REGISTER;.  }.}.
f660: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
f670: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f680: 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
f690: 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
f6a0: 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
f6b0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
f6c0: 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  st onto the stac
f6d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
f6e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
f6f0: 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e  ements pushed on
f700: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f  to the stack..*/
f710: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
f720: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
f730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f740: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
f750: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
f760: 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a  ist *pList    /*
f770: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
f780: 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
f790: 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
f7a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
f7b0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
f7c0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
f7d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
f7e0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
f7f0: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
f800: 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b  st->a, i=n; i>0;
f810: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
f820: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
f830: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74 65  ode(pParse, pIte
f840: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  m->pExpr);.  }. 
f850: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
f860: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f870: 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
f880: 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
f890: 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
f8a0: 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
f8b0: 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
f8c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f8d0: 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
f8e0: 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
f8f0: 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
f900: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
f910: 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
f920: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
f930: 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
f940: 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
f950: 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
f960: 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
f970: 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
f980: 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74 72  fNull flag is tr
f990: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ue..**.** This c
f9a0: 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
f9b0: 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
f9c0: 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
f9d0: 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
f9e0: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
f9f0: 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
fa00: 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
fa10: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
fa20: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
fa30: 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
fa40: 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
fa50: 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
fa60: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
fa70: 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
fa80: 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
fa90: 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
faa0: 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
fab0: 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
fac0: 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
fad0: 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
fae0: 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
faf0: 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
fb00: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
fb10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
fb20: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
fb30: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
fb40: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
fb50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
fb60: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
fb70: 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d    int ckOffset =
fb80: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
fb90: 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  t;.  if( v==0 ||
fba0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
fbb0: 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  rn;.  op = pExpr
fbc0: 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
fbd0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
fbe0: 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69  K_AND: {.      i
fbf0: 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
fc00: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
fc10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fc20: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
fc30: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
fc40: 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29  d2, !jumpIfNull)
fc50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fc60: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
fc70: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
fc80: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
fc90: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
fca0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
fcb0: 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
fcc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fcd0: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
fce0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fcf0: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
fd00: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
fd10: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
fd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fd30: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
fd40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
fd50: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
fd60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fd70: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fd80: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
fd90: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
fda0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
fdb0: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
fdc0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
fdd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fde0: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
fdf0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
fe00: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
fe10: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
fe20: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
fe30: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
fe40: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
fe50: 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
fe60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
fe70: 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
fe80: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
fe90: 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
fea0: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
feb0: 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
fec0: 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
fed0: 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
fee0: 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
fef0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ff00: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ff10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
ff20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ff30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ff40: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
ff50: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
ff60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ff70: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
ff80: 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a  ght, op, dest, j
ff90: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
ffa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ffb0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
ffc0: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
ffd0: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
ffe0: 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
fff0: 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
10000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
10010 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
10020 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  Null );.      sq
10030 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10040 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10050 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
10060 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
10070 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
10080 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10090 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
100a0 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EEN: {.      /* 
100b0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
100c0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
100d0 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  z" is implemente
100e0 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
100f0 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20       ** 1 IF (x 
10100 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  < y) GOTO 3.    
10110 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20    ** 2 IF (x <= 
10120 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20  z) GOTO <dest>. 
10130 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20       ** 3 ....  
10140 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
10150 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70   addr;.      Exp
10160 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
10170 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
10180 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
10190 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
101a0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
101b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
101c0 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
101d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
101e0 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
101f0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
10200 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10210 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
10220 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65 43      addr = codeC
10230 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
10240 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
10250 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e  _Lt, 0, !jumpIfN
10260 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69  ull);..      pRi
10270 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
10280 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
10290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
102a0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
102b0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
102c0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
102d0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
102e0 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d  OP_Le, dest, jum
102f0 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
10300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10310 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
10320 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
10330 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10340 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
10350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10360 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
10370 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
10380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
10390 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
103a0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
103b0 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
103c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
103d0 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75  dOp(v, OP_If, ju
103e0 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
103f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10400 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
10410 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f  ->ckOffset = ckO
10420 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
10430 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
10440 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
10450 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
10460 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
10470 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
10480 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
10490 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
104a0 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
104b0 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
104c0 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
104d0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
104e0 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
104f0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
10500 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
10510 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
10520 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
10530 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
10540 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66  ull is true or f
10550 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
10560 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c  umpIfNull is fal
10570 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
10580 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
10590 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
105a0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
105b0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
105c0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
105d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
105e0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
105f0 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20   int ckOffset = 
10600 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
10610 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
10620 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
10630 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
10640 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
10650 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
10660 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
10670 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
10680 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
10690 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
106a0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
106b0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
106c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
106d0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
106e0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
106f0 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
10700 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
10710 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
10720 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
10730 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
10740 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
10750 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
10760 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
10770 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
10780 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
10790 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
107a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
107b0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
107c0 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
107d0 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
107e0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
107f0 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
10800 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
10810 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
10820 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
10830 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
10840 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
10850 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
10860 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
10870 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
10880 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
10890 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
108a0 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
108b0 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
108c0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
108d0 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
108e0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
108f0 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
10900 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
10910 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
10920 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
10930 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
10940 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
10950 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
10960 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
10970 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
10980 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
10990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
109a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
109b0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
109c0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
109d0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
109e0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
109f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
10a00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
10a10 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
10a20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
10a30 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
10a40 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
10a50 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
10a60 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
10a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
10a80 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
10a90 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
10aa0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
10ab0 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
10ac0 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
10ad0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
10ae0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
10af0 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
10b00 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
10b10 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10b20 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
10b30 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
10b40 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
10b50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10b60 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
10b70 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
10b80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10b90 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
10ba0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
10bb0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
10bc0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
10bd0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
10be0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10bf0 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
10c00 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
10c10 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
10c20 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
10c30 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
10c40 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
10c50 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
10c60 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
10c70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10c80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
10c90 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
10ca0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
10cb0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10cc0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
10cd0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
10ce0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10cf0 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
10d00 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
10d10 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
10d20 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
10d30 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
10d40 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
10d50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10d60 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10d70 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
10d80 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10d90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
10da0 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
10db0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
10dc0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
10dd0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
10de0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
10df0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
10e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10e10 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
10e20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
10e30 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
10e40 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10e50 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
10e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10e70 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
10e80 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
10e90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
10ea0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
10eb0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
10ec0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20  xpression is "x 
10ed0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22  BETWEEN y AND z"
10ee0 2e 20 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e  . It is implemen
10ef0 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a  ted as:.      **
10f00 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28  .      ** 1 IF (
10f10 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20  x >= y) GOTO 3. 
10f20 20 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c       ** 2 GOTO <
10f30 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33  dest>.      ** 3
10f40 20 49 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f   IF (x > z) GOTO
10f50 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f   <dest>.      */
10f60 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10f70 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
10f80 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
10f90 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
10fa0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
10fb0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
10fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10fd0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10fe0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
10ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11000 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
11010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11020 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11030 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64  Right);.      ad
11040 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
11050 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
11060 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
11070 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
11080 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20   pRight, OP_Ge, 
11090 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e  addr+3, !jumpIfN
110a0 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ull);..      sql
110b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
110c0 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
110d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
110e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
110f0 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
11100 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
11110 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
11120 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
11130 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
11140 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
11150 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
11160 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
11170 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73  ight, OP_Gt, des
11180 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
11190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
111a0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
111b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
111c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
111d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
111e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
111f0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70  , OP_IfNot, jump
11200 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20  IfNull, dest);. 
11210 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11220 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
11230 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66  ckOffset = ckOff
11240 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  set;.}../*.** Do
11250 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
11260 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
11270 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
11280 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
11290 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61  ro).** if they a
112a0 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
112b0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   return FALSE if
112c0 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
112d0 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  any way..**.** S
112e0 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72 6f  ometimes this ro
112f0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
11300 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66 20  n FALSE even if 
11310 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
11320 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
11330 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
11340 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
11350 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
11360 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
11370 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
11380 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74 6f  rn FALSE just to
11390 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66   be safe.  So if
113a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
113b0 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c 20   returns false, 
113c0 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20  then you do not 
113d0 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20  really know for 
113e0 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20 74  certain if the t
113f0 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
11400 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
11410 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74 20   But if you get 
11420 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20 74  a TRUE return, t
11430 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
11440 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
11450 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
11460 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
11470 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
11480 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
11490 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
114a0 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
114b0 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61 74  tra FALSE - that
114c0 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20 72  .** just might r
114d0 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c  esult in some sl
114e0 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f  ightly slower co
114f0 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  de.  But returni
11500 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65  ng.** an incorre
11510 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c 65  ct TRUE could le
11520 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74  ad to a malfunct
11530 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
11540 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45  te3ExprCompare(E
11550 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
11560 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  B){.  int i;.  i
11570 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20  f( pA==0||pB==0 
11580 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
11590 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ==pA;.  }.  if( 
115a0 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
115b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
115c0 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
115d0 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
115e0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
115f0 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30  inct) ) return 0
11600 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
11610 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
11620 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
11630 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
11640 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
11650 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
11660 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
11670 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
11680 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pA->pList ){. 
11690 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74     if( pB->pList
116a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
116b0 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73      if( pA->pLis
116c0 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c  t->nExpr!=pB->pL
116d0 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
116e0 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
116f0 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d  =0; i<pA->pList-
11700 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11710 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
11720 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
11730 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
11740 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b  r, pB->pList->a[
11750 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
11760 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11770 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11780 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69  else if( pB->pLi
11790 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
117a0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
117b0 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d  ->pSelect || pB-
117c0 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  >pSelect ) retur
117d0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 0;.  if( pA->i
117e0 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
117f0 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
11800 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
11810 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
11820 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pA->op!=TK_COLUM
11830 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  N && pA->token.z
11840 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
11850 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74  token.z==0 ) ret
11860 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
11870 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e  B->token.n!=pA->
11880 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e  token.n ) return
11890 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
118a0 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
118b0 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28  r*)pA->token.z,(
118c0 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e  char*)pB->token.
118d0 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d  z,pB->token.n)!=
118e0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
118f0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
11900 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f   return 1;.}.../
11910 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
11920 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
11930 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61  ggInfo->aCol[] a
11940 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
11950 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
11960 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
11970 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
11980 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
11990 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
119a0 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
119b0 66 6f 43 6f 6c 75 6d 6e 28 41 67 67 49 6e 66 6f  foColumn(AggInfo
119c0 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
119d0 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c  i;.  pInfo->aCol
119e0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
119f0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20  llocate(.       
11a00 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
11a10 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
11a20 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
11a30 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
11a40 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20  nfo->nColumn,.  
11a50 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
11a60 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20  lumnAlloc,.     
11a70 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
11a80 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
11a90 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
11aa0 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
11ab0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
11ac0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
11ad0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
11ae0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
11af0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
11b00 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
11b10 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
11b20 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
11b30 6f 46 75 6e 63 28 41 67 67 49 6e 66 6f 20 2a 70  oFunc(AggInfo *p
11b40 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
11b50 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d    pInfo->aFunc =
11b60 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
11b70 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 70 49  ocate(.       pI
11b80 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
11b90 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
11ba0 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
11bb0 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70 49     3,.       &pI
11bc0 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20  nfo->nFunc,.    
11bd0 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
11be0 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26 69  Alloc,.       &i
11bf0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  .  );.  return i
11c00 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54  ;.}    ../*.** T
11c10 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63 20  his is an xFunc 
11c20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
11c30 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  () used to imple
11c40 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ment .** sqlite3
11c50 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
11c60 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
11c70 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
11c80 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
11c90 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
11ca0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
11cb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
11cc0 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72 65 67  lyzes the aggreg
11cd0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  ate function at 
11ce0 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pExpr..*/.static
11cf0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
11d00 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72 67  egate(void *pArg
11d10 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
11d20 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
11d30 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e  ontext *pNC = (N
11d40 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70 41 72  ameContext *)pAr
11d50 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  g;.  Parse *pPar
11d60 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
11d70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
11d80 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
11d90 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
11da0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
11db0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 0a 0a  ->pAggInfo;.  ..
11dc0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
11dd0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
11de0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
11df0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
11e00 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N: {.      /* Ch
11e10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
11e20 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
11e30 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
11e40 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
11e50 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
11e60 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
11e70 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
11e80 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
11e90 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
11ea0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
11eb0 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20  = pSrcList->a;. 
11ec0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
11ed0 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
11ee0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
11ef0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
11f00 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
11f10 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Col;.          i
11f20 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
11f30 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
11f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11f50 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
11f60 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
11f70 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
11f80 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
11f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
11fa0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
11fb0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
11fc0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
11fd0 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
11fe0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
11ff0 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
12000 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
12010 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
12020 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
12030 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
12040 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
12050 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
12060 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12070 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
12080 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
12090 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
120a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
120b0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
120c0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
120d0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
120e0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
120f0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
12100 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
12110 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
12120 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
12130 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
12140 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
12150 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
12160 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
12170 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
12180 20 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43   k>=pAggInfo->nC
12190 6f 6c 75 6d 6e 20 26 26 20 28 6b 20 3d 20 61 64  olumn && (k = ad
121a0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
121b0 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29 7b 0a  AggInfo))>=0 ){.
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
121d0 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
121e0 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
121f0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
12200 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
12210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
12220 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
12230 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
12240 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
12250 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
12260 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
12270 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
12280 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
12290 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
122a0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
122b0 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
122c0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
122d0 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
122e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
122f0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
12300 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
12310 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
12320 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
12330 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
12340 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
12350 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
12360 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
12370 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
12380 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
123a0 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
123c0 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
123d0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
123e0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
123f0 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
12400 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
12410 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
12420 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
12430 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
12440 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
12470 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
12480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12490 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
124a0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
124d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
12510 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
12520 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
12530 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
12540 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
12550 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
12560 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
12570 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12580 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12590 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
125a0 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
125b0 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
125c0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
125d0 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
125e0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
125f0 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
12600 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
12610 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
12620 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
12630 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
12640 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
12650 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
12660 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
12670 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
12680 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
12690 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
126a0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
126b0 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
126c0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
126d0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
126e0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
126f0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
12700 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20 20 20  ->iAgg = k;.    
12710 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12720 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
12730 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
12740 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
12750 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
12760 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
12770 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
12780 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
12790 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
127a0 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
127b0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ON: {.      /* T
127c0 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  he pNC->nDepth==
127d0 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67  0 test causes ag
127e0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
127f0 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a  s in subqueries.
12800 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
12810 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  gnored */.      
12820 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
12830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
12840 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12850 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
12860 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
12870 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
12880 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
12890 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
128a0 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
128b0 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
128c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
128d0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
128e0 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
128f0 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
12900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
12910 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
12920 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
12930 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
12940 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
12950 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
12960 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
12970 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12990 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
129a0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
129b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
129c0 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
129d0 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
129e0 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
129f0 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
12a00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
12a10 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
12a20 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
12a30 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
12a40 66 6f 46 75 6e 63 28 70 41 67 67 49 6e 66 6f 29  foFunc(pAggInfo)
12a50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12a60 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
12a70 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
12a80 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
12a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
12aa0 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
12ab0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
12ac0 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  Item->iMem = pPa
12ad0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
12ae0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
12af0 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
12b00 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
12b10 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
12b20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
12b30 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
12b40 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
12b50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12b60 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
12b70 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t ? pExpr->pList
12b80 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
12b90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
12ba0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
12bb0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
12bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12bd0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
12be0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
12bf0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
12c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12c10 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
12c20 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
12c30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12c50 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
12c60 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
12c70 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
12c80 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
12c90 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
12ca0 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
12cb0 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
12cc0 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
12cd0 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
12ce0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
12cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12d00 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73    }..  /* Recurs
12d10 69 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71 75  ively walk subqu
12d20 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  eries looking fo
12d30 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  r TK_COLUMN node
12d40 73 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a  s that need.  **
12d50 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74   to be changed t
12d60 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
12d70 20 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74 20    But increment 
12d80 6e 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a 20  nDepth so that. 
12d90 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   ** TK_AGG_FUNCT
12da0 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75 62  ION nodes in sub
12db0 71 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65 20  queries will be 
12dc0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
12dd0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
12de0 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d  lect ){.    pNC-
12df0 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77  >nDepth++;.    w
12e00 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45  alkSelectExpr(pE
12e10 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e  xpr->pSelect, an
12e20 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
12e30 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e  pNC);.    pNC->n
12e40 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72  Depth--;.  }.  r
12e50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12e60 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
12e70 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
12e80 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
12e90 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
12ea0 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
12eb0 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
12ec0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
12ed0 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
12ee0 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
12ef0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
12f00 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
12f10 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
12f20 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
12f30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
12f40 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
12f50 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
12f60 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
12f70 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
12f80 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  y sqlite3ExprRes
12f90 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a  olveNames()..**.
12fa0 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65  ** If errors are
12fb0 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20   seen, leave an 
12fc0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
12fd0 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74   zErrMsg and ret
12fe0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
12ff0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
13000 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  int sqlite3ExprA
13010 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
13020 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
13030 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
13040 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e  .  int nErr = pN
13050 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  C->pParse->nErr;
13060 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
13070 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67  pExpr, analyzeAg
13080 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20  gregate, pNC);. 
13090 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61   return pNC->pPa
130a0 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72  rse->nErr - nErr
130b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
130c0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
130d0 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
130e0 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
130f0 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
13100 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
13110 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
13120 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
13130 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
13140 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
13150 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
13160 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
13170 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
13180 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
13190 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
131a0 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
131b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
131c0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
131d0 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
131e0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
131f0 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
13200 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72 72  st->a, i=0; nErr
13210 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  ==0 && i<pList->
13220 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
13230 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72 72  m++){.      nErr
13240 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41   += sqlite3ExprA
13250 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
13260 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
13270 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
13280 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a   return nErr;.}.