/ Hex Artifact Content
Login

Artifact 482db8506575b5b257b78cc4ca1e825731cceda4:


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 39 30 20 32 30 30 37 2f 30 35 2f 31 31 20  .290 2007/05/11 
0220: 30 30 3a 32 30 3a 30 38 20 64 72 68 20 45 78 70  00:20:08 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 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
1d60: 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
1d70: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
1d80: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20  P_ExpCollate;.  
1d90: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c        pNew->pCol
1da0: 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f 6c  l = pRight->pCol
1db0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
1dc0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
1dd0: 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f  flags & EP_ExpCo
1de0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 70  llate ){.      p
1df0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
1e00: 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20  _ExpCollate;.   
1e10: 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d     pNew->pColl =
1e20: 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20   pLeft->pColl;. 
1e30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
1e40: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
1e50: 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  (pNew);.  return
1e60: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
1e70: 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74  Works like sqlit
1e80: 65 33 45 78 70 72 28 29 20 62 75 74 20 66 72 65  e3Expr() but fre
1e90: 65 73 20 69 74 73 20 70 4c 65 66 74 20 61 6e 64  es its pLeft and
1ea0: 20 70 52 69 67 68 74 20 61 72 67 75 6d 65 6e 74   pRight argument
1eb0: 73 0a 2a 2a 20 69 66 20 69 74 20 66 61 69 6c 73  s.** if it fails
1ec0: 20 64 75 65 20 74 6f 20 61 20 6d 61 6c 6c 6f 63   due to a malloc
1ed0: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 45 78 70   problem..*/.Exp
1ee0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4f 72  r *sqlite3ExprOr
1ef0: 46 72 65 65 28 69 6e 74 20 6f 70 2c 20 45 78 70  Free(int op, Exp
1f00: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
1f10: 70 52 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f  pRight, const To
1f20: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1f30: 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
1f40: 69 74 65 33 45 78 70 72 28 6f 70 2c 20 70 4c 65  ite3Expr(op, pLe
1f50: 66 74 2c 20 70 52 69 67 68 74 2c 20 70 54 6f 6b  ft, pRight, pTok
1f60: 65 6e 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  en);.  if( pNew=
1f70: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1f80: 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66  3ExprDelete(pLef
1f90: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1fa0: 78 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74  xprDelete(pRight
1fb0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1fc0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  pNew;.}../*.** W
1fd0: 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74  hen doing a nest
1fe0: 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61  ed parse, you ca
1ff0: 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20  n include terms 
2000: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
2010: 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69  .** that look li
2020: 6b 65 20 74 68 69 73 3a 20 20 20 23 30 20 23 31  ke this:   #0 #1
2030: 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74   #2 ...  These t
2040: 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20 65 6c  erms refer to el
2050: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74 68 65  ements.** on the
2060: 20 73 74 61 63 6b 2e 20 20 22 23 30 22 20 6d 65   stack.  "#0" me
2070: 61 6e 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ans the top of t
2080: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23 31  he stack..** "#1
2090: 22 20 6d 65 61 6e 73 20 74 68 65 20 6e 65 78 74  " means the next
20a0: 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61   down on the sta
20b0: 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ck.  And so fort
20c0: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  h..**.** This ro
20d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
20e0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
20f0: 20 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66   deal with on of
2100: 20 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a   those terms..**
2110: 20 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   It immediately 
2120: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
2130: 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  o store the valu
2140: 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f  e in a memory lo
2150: 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72  cation..** The r
2160: 65 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73  eturns an expres
2170: 73 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63  sion that will c
2180: 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
2190: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a  he value from.**
21a0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63   that memory loc
21b0: 61 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e  ation as needed.
21c0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
21d0: 33 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61  3RegisterExpr(Pa
21e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
21f0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56  en *pToken){.  V
2200: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2210: 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a  >pVdbe;.  Expr *
2220: 70 3b 0a 20 20 69 6e 74 20 64 65 70 74 68 3b 0a  p;.  int depth;.
2230: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54    static const T
2240: 6f 6b 65 6e 20 7a 65 72 6f 54 6f 6b 65 6e 20 3d  oken zeroToken =
2250: 20 7b 20 28 75 38 2a 29 22 30 22 2c 20 30 2c 20   { (u8*)"0", 0, 
2260: 31 20 7d 3b 0a 20 20 69 66 28 20 70 50 61 72 73  1 };.  if( pPars
2270: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
2280: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2290: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61  Msg(pParse, "nea
22a0: 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78  r \"%T\": syntax
22b0: 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29   error", pToken)
22c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
22d0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45  ite3Expr(TK_INTE
22e0: 47 45 52 2c 20 30 2c 20 30 2c 20 26 7a 65 72 6f  GER, 0, 0, &zero
22f0: 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  Token);.  }.  if
2300: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
2310: 30 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  0;.  p = sqlite3
2320: 45 78 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52  Expr(TK_REGISTER
2330: 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b  , 0, 0, pToken);
2340: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2350: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
2360: 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a   Malloc failed *
2370: 2f 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20  /.  }.  depth = 
2380: 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f  atoi((char*)&pTo
2390: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d  ken->z[1]);.  p-
23a0: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
23b0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69  ->nMem++;.  sqli
23c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
23d0: 4f 50 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30  OP_Dup, depth, 0
23e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
23f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
2400: 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c  tore, p->iTable,
2410: 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b   1);.  return p;
2420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74  .}../*.** Join t
2430: 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  wo expressions u
2440: 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72  sing an AND oper
2450: 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72  ator.  If either
2460: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
2470: 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73  * NULL, then jus
2480: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68  t return the oth
2490: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  er expression..*
24a0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
24b0: 78 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c 65  xprAnd(Expr *pLe
24c0: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
24d0: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
24e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
24f0: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
2500: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
2510: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
2520: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
2530: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
2540: 70 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74  pr(TK_AND, pLeft
2550: 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
2560: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
2570: 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65  he Expr.span fie
2580: 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ld of the given 
2590: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70  expression to sp
25a0: 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62  an all.** text b
25b0: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67  etween the two g
25c0: 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a  iven tokens..*/.
25d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
25e0: 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72  Span(Expr *pExpr
25f0: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20  , Token *pLeft, 
2600: 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a  Token *pRight){.
2610: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
2620: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2630: 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69   pLeft!=0 );.  i
2640: 66 28 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  f( !sqlite3Mallo
2650: 63 46 61 69 6c 65 64 28 29 20 26 26 20 70 52 69  cFailed() && pRi
2660: 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d  ght->z && pLeft-
2670: 3e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >z ){.    assert
2680: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
2690: 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66  || pLeft->z[pLef
26a0: 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  t->n]==0 );.    
26b0: 69 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d  if( pLeft->dyn==
26c0: 30 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e  0 && pRight->dyn
26d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ==0 ){.      pEx
26e0: 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65  pr->span.z = pLe
26f0: 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78  ft->z;.      pEx
2700: 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69  pr->span.n = pRi
2710: 67 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74  ght->n + (pRight
2720: 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b  ->z - pLeft->z);
2730: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2740: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20    pExpr->span.z 
2750: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
2760: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
2770: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
2780: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
2790: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
27a0: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
27b0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
27c0: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
27d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
27e0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
27f0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
2800: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20   assert( pToken 
2810: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
2820: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
2830: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
2840: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
2850: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2860: 6c 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20  lete(pList); /* 
2870: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
2880: 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  mory when malloc
2890: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
28a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
28b0: 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43  ew->op = TK_FUNC
28c0: 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  TION;.  pNew->pL
28d0: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61  ist = pList;.  a
28e0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64  ssert( pToken->d
28f0: 79 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  yn==0 );.  pNew-
2900: 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e  >token = *pToken
2910: 3b 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d  ;.  pNew->span =
2920: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 0a 20   pNew->token;.. 
2930: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
2940: 65 69 67 68 74 28 70 4e 65 77 29 3b 0a 20 20 72  eight(pNew);.  r
2950: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
2960: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61  *.** Assign a va
2970: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f  riable number to
2980: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2990: 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69  hat encodes a wi
29a0: 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65  ldcard.** in the
29b0: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
29c0: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
29d0: 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69   Wildcards consi
29e0: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
29f0: 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e  e "?" are assign
2a00: 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  ed the next sequ
2a10: 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62  ential.** variab
2a20: 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  le number..**.**
2a30: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
2a40: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72  e form "?nnn" ar
2a50: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
2a60: 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65  umber "nnn".  We
2a70: 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e   make.** sure "n
2a80: 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62  nn" is not too b
2a90: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  e to avoid a den
2aa0: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
2ab0: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
2ac0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2ad0: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
2ae0: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
2af0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
2b00: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
2b10: 22 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  " or "$aaa" are 
2b20: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
2b30: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
2b40: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
2b50: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
2b60: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
2b70: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2b80: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
2b90: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
2ba0: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2bb0: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
2bc0: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
2bd0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2be0: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
2bf0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
2c00: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
2c10: 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  r){.  Token *pTo
2c20: 6b 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ken;.  if( pExpr
2c30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2c40: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
2c50: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
2c60: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
2c70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
2c80: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
2c90: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
2ca0: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
2cb0: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
2cc0: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
2cd0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
2ce0: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
2cf0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2d00: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
2d10: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
2d20: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
2d30: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
2d40: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
2d50: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
2d60: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
2d70: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
2d80: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
2d90: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
2da0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
2db0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
2dc0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2dd0: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63  le = i = atoi((c
2de0: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
2df0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  1]);.    if( i<1
2e00: 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58   || i>SQLITE_MAX
2e10: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
2e20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2e30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2e40: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
2e50: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
2e60: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
2e70: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2e80: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
2e90: 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  MBER);.    }.   
2ea0: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
2eb0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
2ec0: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
2ed0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2ee0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
2ef0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
2f00: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
2f10: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
2f20: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
2f30: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
2f40: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
2f50: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
2f60: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
2f70: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
2f80: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
2f90: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
2fa0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
2fb0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
2fc0: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
2fd0: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
2fe0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
2ff0: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
3000: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
3010: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
3020: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
3030: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
3040: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
3050: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
3060: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
3070: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
3080: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3090: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
30a0: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
30b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
30d0: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
30e0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
30f0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
3100: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
3110: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
3120: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
3130: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
3140: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
3150: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
3160: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
3170: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
3180: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
3190: 3e 61 70 56 61 72 45 78 70 72 20 3d 20 73 71 6c  >apVarExpr = sql
31a0: 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  iteReallocOrFree
31b0: 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78  (pParse->apVarEx
31c0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
31d0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
31e0: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
31f0: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
3200: 61 70 56 61 72 45 78 70 72 5b 30 5d 29 20 29 3b  apVarExpr[0]) );
3210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3220: 66 28 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  f( !sqlite3Mallo
3230: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
3240: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
3250: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d  rse->apVarExpr!=
3260: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
3270: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70  rse->apVarExpr[p
3280: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b  Parse->nVarExpr+
3290: 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  +] = pExpr;.    
32a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20    }.    }.  } . 
32b0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45   if( !pParse->nE
32c0: 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56  rr && pParse->nV
32d0: 61 72 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  ar>SQLITE_MAX_VA
32e0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b  RIABLE_NUMBER ){
32f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
3300: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
3310: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
3320: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
3330: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
3340: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
3350: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
3360: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
3370: 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a  elete(Expr *p){.
3380: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3390: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70  urn;.  if( p->sp
33a0: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  an.dyn ) sqliteF
33b0: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70  ree((char*)p->sp
33c0: 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  an.z);.  if( p->
33d0: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
33e0: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d  teFree((char*)p-
33f0: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c  >token.z);.  sql
3400: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
3410: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  ->pLeft);.  sqli
3420: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
3430: 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69  >pRight);.  sqli
3440: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3450: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73  e(p->pList);.  s
3460: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3470: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
3480: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
3490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78  .}../*.** The Ex
34a0: 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d  pr.token field m
34b0: 69 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67  ight be a string
34c0: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73   literal that is
34d0: 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73   quoted..** If s
34e0: 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75  o, remove the qu
34f0: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a  otation marks..*
3500: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
3510: 71 75 6f 74 65 45 78 70 72 28 45 78 70 72 20 2a  quoteExpr(Expr *
3520: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
3530: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20  sAnyProperty(p, 
3540: 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a  EP_Dequoted) ){.
3550: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
3560: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
3570: 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64  y(p, EP_Dequoted
3580: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
3590: 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  n.dyn==0 ){.    
35a0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
35b0: 28 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e  (&p->token, &p->
35c0: 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  token);.  }.  sq
35d0: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68  lite3Dequote((ch
35e0: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
35f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
3600: 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f  ollowing group o
3610: 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20  f routines make 
3620: 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65  deep copies of e
3630: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65  xpressions,.** e
3640: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c  xpression lists,
3650: 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73   ID lists, and s
3660: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
3670: 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61  .  The copies ca
3680: 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20  n.** be deleted 
3690: 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64  (by being passed
36a0: 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63   to their respec
36b0: 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29  tive ...Delete()
36c0: 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69   routines).** wi
36d0: 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20  thout effecting 
36e0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a  the originals..*
36f0: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
3700: 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e  ion list, ID, an
3710: 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72  d source lists r
3720: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33  eturn by sqlite3
3730: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a  ExprListDup(),.*
3740: 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  * sqlite3IdListD
3750: 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65  up(), and sqlite
3760: 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61  3SrcListDup() ca
3770: 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72  n not be further
3780: 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79   expanded .** by
3790: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
37a0: 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74  s to sqlite*List
37b0: 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  Append() routine
37c0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62  s..**.** Any tab
37d0: 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63  les that the Src
37e0: 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74  List might point
37f0: 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c   to are not dupl
3800: 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  icated..*/.Expr 
3810: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
3820: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
3830: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
3840: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3850: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3860: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
3870: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
3880: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3890: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20  .  memcpy(pNew, 
38a0: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  p, sizeof(*pNew)
38b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
38c0: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e  n.z!=0 ){.    pN
38d0: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75  ew->token.z = (u
38e0: 38 2a 29 73 71 6c 69 74 65 53 74 72 4e 44 75 70  8*)sqliteStrNDup
38f0: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
3900: 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  .z, p->token.n);
3910: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
3920: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  .dyn = 1;.  }els
3930: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
3940: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20  New->token.z==0 
3950: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73  );.  }.  pNew->s
3960: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65  pan.z = 0;.  pNe
3970: 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  w->pLeft = sqlit
3980: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65  e3ExprDup(p->pLe
3990: 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  ft);.  pNew->pRi
39a0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
39b0: 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b  rDup(p->pRight);
39c0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
39d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
39e0: 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  Dup(p->pList);. 
39f0: 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d   pNew->pSelect =
3a00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
3a10: 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  p(p->pSelect);. 
3a20: 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 2d   pNew->pTab = p-
3a30: 3e 70 54 61 62 3b 0a 23 69 66 20 53 51 4c 49 54  >pTab;.#if SQLIT
3a40: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
3a50: 3e 30 0a 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67  >0.  pNew->nHeig
3a60: 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b  ht = p->nHeight;
3a70: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
3a80: 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71   pNew;.}.void sq
3a90: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 54  lite3TokenCopy(T
3aa0: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e  oken *pTo, Token
3ab0: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
3ac0: 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74  pTo->dyn ) sqlit
3ad0: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54 6f  eFree((char*)pTo
3ae0: 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  ->z);.  if( pFro
3af0: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d  m->z ){.    pTo-
3b00: 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20  >n = pFrom->n;. 
3b10: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a     pTo->z = (u8*
3b20: 29 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28  )sqliteStrNDup((
3b30: 63 68 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20  char*)pFrom->z, 
3b40: 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70  pFrom->n);.    p
3b50: 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d  To->dyn = 1;.  }
3b60: 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a  else{.    pTo->z
3b70: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72   = 0;.  }.}.Expr
3b80: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
3b90: 72 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69 73  rListDup(ExprLis
3ba0: 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73  t *p){.  ExprLis
3bb0: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
3bc0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
3bd0: 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65  *pItem, *pOldIte
3be0: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
3bf0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
3c00: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
3c10: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
3c20: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
3c30: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
3c40: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
3c50: 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  pr = pNew->nAllo
3c60: 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20  c = p->nExpr;.  
3c70: 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20  pNew->a = pItem 
3c80: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3c90: 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28  p->nExpr*sizeof(
3ca0: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
3cb0: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
3cc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65    sqliteFree(pNe
3cd0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
3ce0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
3cf0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
3d00: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
3d10: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
3d20: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
3d30: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20  Expr *pNewExpr, 
3d40: 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70  *pOldExpr;.    p
3d50: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
3d60: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
3d70: 45 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72  ExprDup(pOldExpr
3d80: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
3d90: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  pr);.    if( pOl
3da0: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30  dExpr->span.z!=0
3db0: 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a   && pNewExpr ){.
3dc0: 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20        /* Always 
3dd0: 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
3de0: 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d  he span for top-
3df0: 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e  level expression
3e00: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  s in the.      *
3e10: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
3e20: 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e  t.  The logic in
3e30: 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69   SELECT processi
3e40: 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ng that determin
3e50: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  es.      ** the 
3e60: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
3e70: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
3e80: 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e  et needs this in
3e90: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
3ea0: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
3eb0: 6f 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73  opy(&pNewExpr->s
3ec0: 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e  pan, &pOldExpr->
3ed0: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  span);.    }.   
3ee0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70   assert( pNewExp
3ef0: 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72  r==0 || pNewExpr
3f00: 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20  ->span.z!=0 .   
3f10: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64           || pOld
3f20: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a  Expr->span.z==0.
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
3f40: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
3f50: 65 64 28 29 20 29 3b 0a 20 20 20 20 70 49 74 65  ed() );.    pIte
3f60: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
3f70: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3f80: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
3f90: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
3fa0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
3fb0: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
3fc0: 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65  >isAgg = pOldIte
3fd0: 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49  m->isAgg;.    pI
3fe0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
3ff0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
4000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75  ;.}../*.** If cu
4010: 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c  rsors, triggers,
4020: 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
4030: 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d  eries are all om
4040: 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  itted from.** th
4050: 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f  e build, then no
4060: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
4070: 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78  ing routines, ex
4080: 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c  cept for .** sql
4090: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c  ite3SelectDup(),
40a0: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
40b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
40c0: 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a  () is sometimes.
40d0: 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
40e0: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a   NULL argument..
40f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
4100: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
4110: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
4120: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
4130: 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65  R) \. || !define
4140: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
4150: 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20  BQUERY).SrcList 
4160: 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  *sqlite3SrcListD
4170: 75 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  up(SrcList *p){.
4180: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
4190: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
41a0: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
41b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
41c0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
41d0: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
41e0: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
41f0: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
4200: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
4210: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
4220: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
4230: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
4240: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20  0;.  pNew->nSrc 
4250: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
4260: 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28   p->nSrc;.  for(
4270: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20  i=0; i<p->nSrc; 
4280: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
4290: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
42a0: 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d  NewItem = &pNew-
42b0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63  >a[i];.    struc
42c0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
42d0: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
42e0: 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  [i];.    Table *
42f0: 70 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  pTab;.    pNewIt
4300: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
4310: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
4320: 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  dItem->zDatabase
4330: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4340: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
4350: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
4360: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
4370: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
4380: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
4390: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
43a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69     pNewItem->joi
43b0: 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d  ntype = pOldItem
43c0: 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
43d0: 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pNewItem->iCurso
43e0: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43  r = pOldItem->iC
43f0: 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49  ursor;.    pNewI
4400: 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
4410: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50   = pOldItem->isP
4420: 6f 70 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 54  opulated;.    pT
4430: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
4440: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
4450: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
4460: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
4470: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
4480: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
4490: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
44a0: 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65  electDup(pOldIte
44b0: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
44c0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
44d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
44e0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  pOldItem->pOn);.
44f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
4500: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
4510: 4c 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d  ListDup(pOldItem
4520: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
4530: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
4540: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
4550: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
4560: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
4570: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
4580: 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a  Dup(IdList *p){.
4590: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
45a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
45b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
45c0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
45d0: 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
45e0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
45f0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
4600: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
4610: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
4620: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
4630: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ->a = sqliteMall
4640: 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69  ocRaw( p->nId*si
4650: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
4660: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
4670: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  0 ){.    sqliteF
4680: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72  ree(pNew);.    r
4690: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
46a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
46b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
46c0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
46d0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
46e0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
46f0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
4700: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
4710: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
4720: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
4730: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
4740: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
4750: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
4760: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
4770: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4780: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
4790: 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63  3SelectDup(Selec
47a0: 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
47b0: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
47c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
47d0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
47e0: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
47f0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
4800: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4810: 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e    pNew->isDistin
4820: 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
4830: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69  ct;.  pNew->pELi
4840: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
4850: 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73  ListDup(p->pELis
4860: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  t);.  pNew->pSrc
4870: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
4880: 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20  tDup(p->pSrc);. 
4890: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
48a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
48b0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
48c0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
48d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
48e0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
48f0: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
4900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4910: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70  p->pHaving);.  p
4920: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
4930: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4940: 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  up(p->pOrderBy);
4950: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
4960: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
4970: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
4980: 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72  ectDup(p->pPrior
4990: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
49a0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
49b0: 75 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  up(p->pLimit);. 
49c0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
49d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
49e0: 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
49f0: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  New->iLimit = -1
4a00: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
4a10: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
4a20: 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e  isResolved = p->
4a30: 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e  isResolved;.  pN
4a40: 65 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69  ew->isAgg = p->i
4a50: 73 41 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75 73  sAgg;.  pNew->us
4a60: 65 73 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70 4e  esEphm = 0;.  pN
4a70: 65 77 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65  ew->disallowOrde
4a80: 72 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  rBy = 0;.  pNew-
4a90: 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
4aa0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
4ab0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
4ac0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
4ad0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
4ae0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
4af0: 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74  m[2] = -1;.  ret
4b00: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
4b10: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
4b20: 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63  3SelectDup(Selec
4b30: 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t *p){.  assert(
4b40: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
4b50: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
4b60: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
4b70: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
4b80: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
4b90: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
4ba0: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
4bb0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
4bc0: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
4bd0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
4be0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
4bf0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
4c00: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
4c10: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f   Expr *pExpr, To
4c20: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4c30: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
4c40: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
4c50: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
4c60: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
4c70: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
4c80: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
4c90: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  em;.    }.    as
4ca0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c  sert( pList->nAl
4cb0: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  loc==0 );.  }.  
4cc0: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  if( pList->nAllo
4cd0: 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  c<=pList->nExpr 
4ce0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
4cf0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
4d00: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
4d10: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
4d20: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
4d30: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
4d40: 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d   n*sizeof(pList-
4d50: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
4d60: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
4d70: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
4d80: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
4d90: 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   a;.    pList->n
4da0: 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20  Alloc = n;.  }. 
4db0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
4dc0: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  a!=0 );.  if( pE
4dd0: 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a  xpr || pName ){.
4de0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
4df0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
4e00: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
4e10: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
4e20: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
4e30: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
4e40: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
4e50: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
4e60: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
4e70: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
4e80: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
4e90: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
4ea0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
4eb0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
4ec0: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
4ed0: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
4ee0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
4ef0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
4f00: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4f10: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
4f20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4f30: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
4f40: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
4f50: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
4f60: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
4f70: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
4f80: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
4f90: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
4fa0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
4fb0: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
4fc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
4fd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
4fe0: 74 2c 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 2c  t,.  int iLimit,
4ff0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5000: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 66 28 20  Object.){.  if( 
5010: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
5020: 2d 3e 6e 45 78 70 72 3e 69 4c 69 6d 69 74 20 29  ->nExpr>iLimit )
5030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5040: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5050: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
5060: 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74 29  in %s", zObject)
5070: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 53 51  ;.  }.}...#if SQ
5080: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
5090: 50 54 48 3e 30 0a 2f 2a 20 54 68 65 20 66 6f 6c  PTH>0./* The fol
50a0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
50b0: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
50c0: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
50d0: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
50e0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
50f0: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
5100: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
5110: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
5120: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
5130: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
5140: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
5150: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
5160: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
5170: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
5180: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
5190: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
51a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
51b0: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
51c0: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
51d0: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
51e0: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
51f0: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
5200: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
5210: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
5220: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
5230: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
5240: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
5250: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
5260: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
5270: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
5280: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
5290: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
52a0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
52b0: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
52c0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
52d0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
52e0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
52f0: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
5300: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
5310: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
5320: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
5330: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
5340: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
5350: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
5360: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
5370: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
5380: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5390: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
53a0: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
53b0: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
53c0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
53d0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
53e0: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
53f0: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5400: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
5410: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
5420: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
5430: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
5440: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
5450: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
5460: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
5470: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
5480: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
5490: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
54a0: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
54b0: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
54c0: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
54d0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
54e0: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
54f0: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
5500: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
5510: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
5520: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
5530: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
5540: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
5550: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
5560: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
5570: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
5580: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
5590: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
55a0: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
55b0: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
55c0: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
55d0: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
55e0: 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ne..*/.void sqli
55f0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
5600: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
5610: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
5620: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
5630: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
5640: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
5650: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
5660: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
5670: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4c 69  fExprList(p->pLi
5680: 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20  st, &nHeight);. 
5690: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
56a0: 70 2d 3e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  p->pSelect, &nHe
56b0: 69 67 68 74 29 3b 0a 20 20 70 2d 3e 6e 48 65 69  ight);.  p->nHei
56c0: 67 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20  ght = nHeight + 
56d0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
56e0: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  rn the maximum h
56f0: 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70  eight of any exp
5700: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
5710: 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68  erenced.** by th
5720: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5730: 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
5740: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
5750: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
5760: 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74 20  prHeight(Select 
5770: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
5780: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
5790: 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65  OfSelect(p, &nHe
57a0: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
57b0: 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6e 64 69  nHeight;.}.#endi
57c0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  f../*.** Delete 
57d0: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
57e0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
57f0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
5800: 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73  stDelete(ExprLis
5810: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
5820: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
5830: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
5840: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
5850: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
5860: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
5870: 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78  0 || (pList->nEx
5880: 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e  pr==0 && pList->
5890: 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20  nAlloc==0) );.  
58a0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
58b0: 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr<=pList->nAl
58c0: 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  loc );.  for(pIt
58d0: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
58e0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
58f0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
5900: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5910: 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45  Delete(pItem->pE
5920: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
5930: 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Free(pItem->zNam
5940: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
5950: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
5960: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
5970: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  st);.}../*.** Wa
5980: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
5990: 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46 75   tree.  Call xFu
59a0: 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65  nc for each node
59b0: 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   visited..**.** 
59c0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
59d0: 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74 65   from xFunc dete
59e0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 74  rmines whether t
59f0: 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e  he tree walk con
5a00: 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61  tinues..** 0 mea
5a10: 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b  ns continue walk
5a20: 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20 31  ing the tree.  1
5a30: 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61   means do not wa
5a40: 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f  lk children.** o
5a50: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  f the current no
5a60: 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  de but continue 
5a70: 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20 20  with siblings.  
5a80: 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a  2 means abandon.
5a90: 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  ** the tree walk
5aa0: 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a   completely..**.
5ab0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
5ac0: 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  lue from this ro
5ad0: 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61 62  utine is 1 to ab
5ae0: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
5af0: 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20  alk.** and 0 to 
5b00: 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
5b10: 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72 6f  NOTICE:  This ro
5b20: 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74 2a  utine does *not*
5b30: 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73 75   descend into su
5b40: 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61  bqueries..*/.sta
5b50: 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72  tic int walkExpr
5b60: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 2c  List(ExprList *,
5b70: 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c   int (*)(void *,
5b80: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29   Expr*), void *)
5b90: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  ;.static int wal
5ba0: 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20 2a  kExprTree(Expr *
5bb0: 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75  pExpr, int (*xFu
5bc0: 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29  nc)(void*,Expr*)
5bd0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
5be0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
5bf0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
5c00: 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75   0;.  rc = (*xFu
5c10: 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72 29  nc)(pArg, pExpr)
5c20: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5c30: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
5c40: 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65  rTree(pExpr->pLe
5c50: 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ft, xFunc, pArg)
5c60: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
5c70: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
5c80: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  e(pExpr->pRight,
5c90: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
5ca0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
5cb0: 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  ( walkExprList(p
5cc0: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75  Expr->pList, xFu
5cd0: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
5ce0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
5cf0: 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn rc>1;.}../*.*
5d00: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
5d10: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
5d20: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69  expression in li
5d30: 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st p..*/.static 
5d40: 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  int walkExprList
5d50: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
5d60: 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20  t (*xFunc)(void 
5d70: 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  *, Expr*), void 
5d80: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b  *pArg){.  int i;
5d90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
5da0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
5db0: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
5dc0: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  n 0;.  for(i=p->
5dd0: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
5de0: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
5df0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 77  em++){.    if( w
5e00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74 65  alkExprTree(pIte
5e10: 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c  m->pExpr, xFunc,
5e20: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
5e30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
5e40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  0;.}../*.** Call
5e50: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
5e60: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
5e70: 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 70  sion in Select p
5e80: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a  , not including.
5e90: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
5ea0: 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20  hat are part of 
5eb0: 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 61  sub-selects in a
5ec0: 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ny FROM clause o
5ed0: 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f  r the LIMIT.** o
5ee0: 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73 73  r OFFSET express
5ef0: 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ions...*/.static
5f00: 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74 45   int walkSelectE
5f10: 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  xpr(Select *p, i
5f20: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
5f30: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
5f40: 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45   *pArg){.  walkE
5f50: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
5f60: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  t, xFunc, pArg);
5f70: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
5f80: 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e 63  p->pWhere, xFunc
5f90: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
5fa0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
5fb0: 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  pBy, xFunc, pArg
5fc0: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  );.  walkExprTre
5fd0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46  e(p->pHaving, xF
5fe0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
5ff0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  lkExprList(p->pO
6000: 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20 70  rderBy, xFunc, p
6010: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
6020: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
6030: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
6040: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
6050: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
6060: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20  e()..**.** pArg 
6070: 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
6080: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
6090: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74 65  r.  If we can te
60a0: 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  ll by looking.**
60b0: 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20 74   at pExpr that t
60c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
60d0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78 70  at contains pExp
60e0: 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  r is not a const
60f0: 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
6100: 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41 72  n, then set *pAr
6110: 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  g to 0 and retur
6120: 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  n 2 to abandon t
6130: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
6140: 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20 64   If pExpr does d
6150: 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c 69  oes not disquali
6160: 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
6170: 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20 63  n from being a c
6180: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20  onstant.** then 
6190: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  do nothing..**.*
61a0: 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67 20  * After walking 
61b0: 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c 20  the whole tree, 
61c0: 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20  if no nodes are 
61d0: 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71 75  found that disqu
61e0: 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78 70  alify.** the exp
61f0: 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74  ression as const
6200: 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73 73  ant, then we ass
6210: 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ume the whole ex
6220: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
6230: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73 71  onstant.  See sq
6240: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
6250: 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  ant() for additi
6260: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
6270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6280: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
6290: 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  nt(void *pArg, E
62a0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
62b0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
62c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
62d0: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
62e0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
62f0: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
6300: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
6310: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72  .    ** and *pAr
6320: 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65  g==2 */.    case
6330: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
6340: 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74 2a 29      if( *((int*)
6350: 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74 75 72  pArg)==2 ) retur
6360: 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  n 0;.      /* Fa
6370: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
6380: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
6390: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
63a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
63b0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  T:.    case TK_A
63c0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
63d0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
63e0: 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN:.#ifndef SQL
63f0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6400: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
6410: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
6420: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
6430: 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70  .      *((int*)p
6440: 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  Arg) = 0;.      
6450: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63 61  return 2;.    ca
6460: 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20  se TK_IN:.      
6470: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
6480: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  ct ){.        *(
6490: 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b  (int*)pArg) = 0;
64a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
64b0: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64  2;.      }.    d
64c0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
64d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
64e0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
64f0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
6500: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
6510: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
6520: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
6530: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
6540: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
6550: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
6560: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
6570: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
6580: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
6590: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
65a0: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
65b0: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
65c0: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
65d0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
65e0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
65f0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
6600: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
6610: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
6620: 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74  ){.  int isConst
6630: 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 1;.  walkExpr
6640: 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65  Tree(p, exprNode
6650: 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43  IsConstant, &isC
6660: 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  onst);.  return 
6670: 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  isConst;.}../*.*
6680: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
6690: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
66a0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
66b0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
66c0: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
66d0: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
66e0: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
66f0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
6700: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
6710: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
6720: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
6730: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
6740: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
6750: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
6760: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
6770: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
6780: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
6790: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
67a0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
67b0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
67c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
67d0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
67e0: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
67f0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
6800: 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   2;.  walkExprTr
6810: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
6820: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
6830: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
6840: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
6850: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
6860: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
6870: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
6880: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
6890: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
68a0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
68b0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
68c0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
68d0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
68e0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
68f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6900: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6910: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
6920: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
6930: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
6940: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
6950: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
6960: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
6970: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6980: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
6990: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
69a0: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
69b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
69c0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
69d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
69e0: 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29  GetInt32((char*)
69f0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
6a00: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
6a10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
6a20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6a30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6a40: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
6a50: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
6a60: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
6a70: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
6a80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6a90: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
6aa0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
6ab0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
6ac0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
6ad0: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
6ae0: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
6af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6b10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6b20: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
6b30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6b40: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
6b50: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
6b60: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
6b70: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
6b80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
6b90: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
6ba0: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
6bb0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
6bc0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
6bd0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
6be0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
6bf0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
6c00: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
6c10: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
6c20: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
6c30: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
6c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
6c50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
6c60: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
6c70: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
6c80: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
6c90: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
6ca0: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
6cb0: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
6cc0: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
6cd0: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
6ce0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
6cf0: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
6d00: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
6d10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
6d20: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
6d30: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
6d40: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
6d50: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
6d60: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
6d70: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
6d80: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
6db0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
6dc0: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
6dd0: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
6de0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6df0: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
6e00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
6e10: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
6e20: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
6e30: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
6e40: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
6e50: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
6e60: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
6e70: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
6e80: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
6e90: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
6ea0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
6eb0: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
6ec0: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
6ed0: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
6ee0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
6ef0: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
6f00: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
6f10: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
6f20: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
6f30: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
6f40: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
6f50: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
6f60: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
6f70: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
6f80: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
6f90: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
6fa0: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
6fb0: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
6fc0: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
6fd0: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
6fe0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6ff0: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
7000: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
7010: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
7020: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
7030: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
7040: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
7050: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
7060: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
7070: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
7080: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
7090: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
70a0: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
70b0: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
70c0: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
70d0: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
70e0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
70f0: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
7100: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
7110: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
7120: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
7130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
7140: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
7150: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7160: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
7170: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
7180: 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20  en *pDbToken,   
7190: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
71a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
71b0: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
71c0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
71d0: 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a  pTableToken,  /*
71e0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
71f0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
7200: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
7210: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b  oken *pColumnTok
7220: 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  en, /* Name of t
7230: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
7240: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7250: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
7260: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
7270: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
7280: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
7290: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
72a0: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
72b0: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
72c0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
72d0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
72e0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  b = 0;       /* 
72f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
7300: 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69  base.  The "X" i
7310: 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61  n X.Y.Z */.  cha
7320: 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
7330: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7340: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22   table.  The "Y"
7350: 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a   in X.Y.Z or Y.Z
7360: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
7370: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
7380: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
7390: 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20  .  The "Z" */.  
73a0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
73b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
73c0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
73d0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
73e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
73f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
7400: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
7410: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
7420: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
7430: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
7440: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
7450: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
7460: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
7470: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7480: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
7490: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
74a0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
74b0: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
74c0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
74d0: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
74e0: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
74f0: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
7500: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
7510: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
7520: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
7530: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
7540: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20   the list */..  
7550: 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54  assert( pColumnT
7560: 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54  oken && pColumnT
7570: 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68  oken->z ); /* Th
7580: 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e  e Z in X.Y.Z can
7590: 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  not be NULL */. 
75a0: 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61   zDb = sqlite3Na
75b0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54  meFromToken(pDbT
75c0: 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20  oken);.  zTab = 
75d0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
75e0: 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e  oken(pTableToken
75f0: 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69  );.  zCol = sqli
7600: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7610: 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a  (pColumnToken);.
7620: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
7630: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
7640: 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61     goto lookupna
7650: 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70  me_end;.  }..  p
7660: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d  Expr->iTable = -
7670: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20  1;.  while( pNC 
7680: 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  && cnt==0 ){.   
7690: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
76a0: 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
76b0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
76c0: 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69  pSrcList;..    i
76d0: 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
76e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49       for(i=0, pI
76f0: 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b  tem=pSrcList->a;
7700: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
7710: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
7720: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
7730: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  *pTab;.        i
7740: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
7750: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
7760: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
7770: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
7780: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
7790: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b!=0 );.        
77a0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
77b0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
77c0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
77d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
77e0: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
77f0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20         if( zTab 
7800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
7810: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
7820: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
7830: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
7840: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
7850: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
7860: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
7870: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
7880: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7890: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
78a0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
78b0: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
78c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
78d0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
78e0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
78f0: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
7900: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
7910: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7920: 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71  if( zDb!=0 && sq
7930: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
7940: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
7950: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
7960: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
7970: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
7980: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
7990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
79a0: 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b  if( 0==(cntTab++
79b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
79c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
79d0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
79e0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
79f0: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
7a00: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
7a10: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
7a20: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
7a30: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43       for(j=0, pC
7a40: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
7a50: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
7a60: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
7a70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7a80: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
7a90: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
7aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
7ab0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
7ac0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
7ad0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
7ae0: 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
7af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ;.            cn
7b00: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
7b10: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
7b20: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
7b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61  .            pMa
7b40: 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20  tch = pItem;.   
7b50: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7b60: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
7b70: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
7b80: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
7b90: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
7ba0: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
7bb0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
7bc0: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
7bd0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
7be0: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
7bf0: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
7c00: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7c10: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
7c20: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
7c30: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
7c40: 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
7c50: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
7c60: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
7c70: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
7c80: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
7c90: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
7ca0: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20  (db), zColl,-1, 
7cb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7cc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
7cd0: 28 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ( i<pSrcList->nS
7ce0: 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc-1 ){.        
7cf0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 5b        if( pItem[
7d00: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
7d10: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7d30: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
7d40: 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66  urred in the lef
7d50: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74  t table of a nat
7d60: 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20  ural join,.     
7d70: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
7d80: 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67 68  en skip the righ
7d90: 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64  t table to avoid
7da0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74   a duplicate mat
7db0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
7dc0: 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20        pItem++;. 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
7de0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
7df0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55 73    }else if( (pUs
7e00: 69 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70  ing = pItem[1].p
7e10: 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20  Using)!=0 ){.   
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e30: 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63  If this match oc
7e40: 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  curs on a column
7e50: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
7e60: 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 20  USING clause.   
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
7e80: 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20  of a join, skip 
7e90: 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74 68  the search of th
7ea0: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
7eb0: 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20   the join.      
7ec0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
7ed0: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
7ee0: 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a  e match there. *
7ef0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
7f00: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
7f10: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
7f20: 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b  ; k<pUsing->nId;
7f30: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
7f40: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
7f50: 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73 69  ite3StrICmp(pUsi
7f60: 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20  ng->a[k].zName, 
7f70: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b               i++
7fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7fc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ff0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
8000: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
8010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
8020: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
8030: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8040: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
8050: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
8060: 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77  GGER.    /* If w
8070: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
8080: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20  dy resolved the 
8090: 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65  name, then maybe
80a0: 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61   .    ** it is a
80b0: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
80c0: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
80d0: 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a   reference.    *
80e0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  /.    if( zDb==0
80f0: 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63   && zTab!=0 && c
8100: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  nt==0 && pParse-
8110: 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b  >trigStack!=0 ){
8120: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74  .      TriggerSt
8130: 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61  ack *pTriggerSta
8140: 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69  ck = pParse->tri
8150: 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61  gStack;.      Ta
8160: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
8170: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
8180: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
8190: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
81a0: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
81b0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
81c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
81d0: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
81e0: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
81f0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
8200: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
8210: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
8220: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
8230: 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pTab;.      }els
8240: 65 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74  e if( pTriggerSt
8250: 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d  ack->oldIdx != -
8260: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
8270: 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29  Cmp("old", zTab)
8280: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
8290: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
82a0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
82b0: 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  dIdx;.        as
82c0: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
82d0: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
82e0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
82f0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
8300: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8310: 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20  if( pTab ){ .   
8320: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
8330: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
8340: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
8350: 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ;..        pExpr
8360: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62  ->pSchema = pTab
8370: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
8380: 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20     cntTab++;.   
8390: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
83a0: 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43   iCol < pTab->nC
83b0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c  ol; iCol++, pCol
83c0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
83d0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
83e0: 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
83f0: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
8400: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
8410: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62  ar *zColl = pTab
8420: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f  ->aCol[iCol].zCo
8430: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
8440: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
8450: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
8460: 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  n = iCol==pTab->
8470: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f  iPKey ? -1 : iCo
8480: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
8490: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
84a0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
84b0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
84c0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78          if( (pEx
84d0: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pr->flags & EP_E
84e0: 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b  xpCollate)==0 ){
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
8500: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
8510: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
8520: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
8530: 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20  oll,-1, 0);.    
8540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8550: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
8560: 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
8570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8590: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
85a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
85b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
85c0: 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20  TRIGGER) */..   
85d0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61   /*.    ** Perha
85e0: 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61  ps the name is a
85f0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
8600: 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20  e ROWID.    */. 
8610: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
8620: 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71   cntTab==1 && sq
8630: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
8640: 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20  l) ){.      cnt 
8650: 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72  = 1;.      pExpr
8660: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ->iColumn = -1;.
8670: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
8680: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
8690: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
86a0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
86b0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
86c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28   of the form Z (
86d0: 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a  not Y.Z or X.Y.Z
86e0: 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20  ) then the name 
86f0: 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72  Z.    ** might r
8700: 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c  efer to an resul
8710: 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68  t-set alias.  Th
8720: 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
8730: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20  example, when.  
8740: 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f    ** we are reso
8750: 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74  lving names in t
8760: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
8770: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
8780: 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a   command:.    **
8790: 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
87a0: 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d  CT a+b AS x FROM
87b0: 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31   table WHERE x<1
87c0: 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0;.    **.    **
87d0: 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74   In cases like t
87e0: 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78  his, replace pEx
87f0: 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  pr with a copy o
8800: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
8810: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72   that.    ** for
8820: 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ms the result se
8830: 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69  t entry ("a+b" i
8840: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61  n the example) a
8850: 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
8860: 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f  ately..    ** No
8870: 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  te that the expr
8880: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
8890: 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20  sult set should 
88a0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
88b0: 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65  n.    ** resolve
88c0: 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  d by the time th
88d0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
88e0: 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20  s resolved..    
88f0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
8900: 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d 20 70  0 && (pEList = p
8910: 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30 20 26  NC->pEList)!=0 &
8920: 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  & zTab==0 ){.   
8930: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45     for(j=0; j<pE
8940: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
8950: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
8960: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
8970: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
8980: 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26     if( zAs!=0 &&
8990: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
89a0: 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  zAs, zCol)==0 ){
89b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
89c0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
89d0: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
89e0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
89f0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
8a00: 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20 20 20 20  TK_AS;.         
8a10: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
8a20: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = j;.          p
8a30: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
8a40: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c  lite3ExprDup(pEL
8a50: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
8a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 20  ;.          cnt 
8a70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 1;.          a
8a80: 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26  ssert( zTab==0 &
8a90: 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  & zDb==0 );.    
8aa0: 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75        goto looku
8ab0: 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20 20  pname_end_2;.   
8ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a       }.      } .
8ad0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
8ae0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
8af0: 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  t name context. 
8b00: 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65   The loop will e
8b10: 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a  xit when either.
8b20: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61      ** we have a
8b30: 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f   match (cnt>0) o
8b40: 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75  r when we run ou
8b50: 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78  t of name contex
8b60: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
8b70: 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  f( cnt==0 ){.   
8b80: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
8b90: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
8ba0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61    /*.  ** If X a
8bb0: 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69  nd Y are NULL (i
8bc0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
8bd0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
8be0: 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20   name Z is.  ** 
8bf0: 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68  supplied) and th
8c00: 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20  e value of Z is 
8c10: 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62  enclosed in doub
8c20: 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a  le-quotes, then.
8c30: 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69    ** Z is a stri
8c40: 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74  ng literal if it
8c50: 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61   doesn't match a
8c60: 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  ny column names.
8c70: 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63    In that.  ** c
8c80: 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
8c90: 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
8ca0: 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61  y and not make a
8cb0: 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20  ny changes to.  
8cc0: 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20  ** pExpr..  **. 
8cd0: 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72   ** Because no r
8ce0: 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64  eference was mad
8cf0: 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65  e to outer conte
8d00: 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52  xts, the pNC->nR
8d10: 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61  ef.  ** fields a
8d20: 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69  re not changed i
8d30: 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20  n any context.. 
8d40: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
8d50: 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70   && zTab==0 && p
8d60: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30  ColumnToken->z[0
8d70: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71  ]=='"' ){.    sq
8d80: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a  liteFree(zCol);.
8d90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8da0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74  }..  /*.  ** cnt
8db0: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ==0 means there 
8dc0: 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20  was not match.  
8dd0: 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72  cnt>1 means ther
8de0: 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20  e were two or.  
8df0: 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e  ** more matches.
8e00: 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65    Either way, we
8e10: 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a   have an error..
8e20: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d    */.  if( cnt!=
8e30: 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  1 ){.    char *z
8e40: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
8e50: 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d  zErr;.    zErr =
8e60: 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75   cnt==0 ? "no su
8e70: 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a  ch column: %s" :
8e80: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
8e90: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20  mn name: %s";.  
8ea0: 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20    if( zDb ){.   
8eb0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
8ec0: 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22  ing(&z, zDb, "."
8ed0: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
8ee0: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
8ef0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62    }else if( zTab
8f00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8f10: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
8f20: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
8f30: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d  (char*)0);.    }
8f40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
8f50: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 43 6f  sqliteStrDup(zCo
8f60: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
8f70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8f80: 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a  arse, zErr, z);.
8f90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
8fa0: 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e  );.    pTopNC->n
8fb0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Err++;.  }..  /*
8fc0: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f   If a column fro
8fd0: 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72  m a table in pSr
8fe0: 63 4c 69 73 74 20 69 73 20 72 65 66 65 72 65 6e  cList is referen
8ff0: 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ced, then record
9000: 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20  .  ** this fact 
9010: 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e  in the pSrcList.
9020: 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d  a[].colUsed bitm
9030: 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63  ask.  Column 0 c
9040: 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30  auses.  ** bit 0
9050: 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c   to be set.  Col
9060: 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20 31  umn 1 sets bit 1
9070: 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
9080: 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f    If the.  ** co
9090: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67  lumn number is g
90a0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
90b0: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
90c0: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20  n the bitmask.  
90d0: 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  ** then set the 
90e0: 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f  high-order bit o
90f0: 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20  f the bitmask.. 
9100: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
9110: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
9120: 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20  Match!=0 ){.    
9130: 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69  int n = pExpr->i
9140: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20  Column;.    if( 
9150: 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  n>=sizeof(Bitmas
9160: 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20  k)*8 ){.      n 
9170: 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  = sizeof(Bitmask
9180: 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  )*8-1;.    }.   
9190: 20 61 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d   assert( pMatch-
91a0: 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d  >iCursor==pExpr-
91b0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70  >iTable );.    p
91c0: 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c  Match->colUsed |
91d0: 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
91e0: 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61  n;.  }..lookupna
91f0: 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65  me_end:.  /* Cle
9200: 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
9210: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
9220: 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  ee(zDb);.  sqlit
9230: 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73  eFree(zTab);.  s
9240: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9250: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
9260: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
9270: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
9280: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
9290: 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d  Right);.  pExpr-
92a0: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70  >pRight = 0;.  p
92b0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
92c0: 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65  LUMN;.lookupname
92d0: 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65  _end_2:.  sqlite
92e0: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66  Free(zCol);.  if
92f0: 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( cnt==1 ){.    
9300: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
9310: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  ;.    sqlite3Aut
9320: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
9330: 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  xpr, pNC->pSrcLi
9340: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  st);.    if( pMa
9350: 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e  tch && !pMatch->
9360: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
9370: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
9380: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
9390: 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d   }.    /* Increm
93a0: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
93b0: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
93c0: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
93d0: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
93e0: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
93f0: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
9400: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
9410: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9420: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
9430: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
9440: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
9450: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
9460: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
9470: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
9480: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
9490: 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   0;.  } else {. 
94a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
94b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
94c0: 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e  outine is design
94d0: 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66  ed as an xFunc f
94e0: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
94f0: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
9500: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
9510: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
9520: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
9530: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
9540: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
9550: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
9560: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
9570: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
9580: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
9590: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
95a0: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
95b0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
95c0: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
95d0: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
95e0: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
95f0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
9600: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
9610: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
9620: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
9630: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
9640: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
9650: 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65   int nameResolve
9660: 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67  rStep(void *pArg
9670: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9680: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
9690: 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
96a0: 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65  t*)pArg;.  Parse
96b0: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
96c0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
96d0: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
96e0: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  pNC!=0 );.  pPar
96f0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
9700: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
9710: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
9720: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
9730: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78  ) return 1;.  Ex
9740: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
9750: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
9760: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
9770: 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72  G.  if( pNC->pSr
9780: 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53  cList && pNC->pS
9790: 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30  rcList->nAlloc>0
97a0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
97b0: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
97c0: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69  >pSrcList;.    i
97d0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
97e0: 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69  0; i<pNC->pSrcLi
97f0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
9800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
9810: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
9820: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
9830: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
9840: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
9850: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
9860: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
9870: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
9880: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
9890: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
98a0: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
98b0: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
98c0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
98d0: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
98e0: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
98f0: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
9900: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
9910: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
9920: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
9930: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
9940: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
9950: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
9960: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
9970: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
9980: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
9990: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
99a0: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
99b0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
99c0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
99d0: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
99e0: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
99f0: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
9a00: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
9a10: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
9a20: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
9a30: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
9a40: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
9a50: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
9a60: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
9a70: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
9a80: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
9a90: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
9aa0: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
9ab0: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
9ac0: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
9ad0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9ae0: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
9af0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
9b00: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
9b10: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
9b20: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
9b30: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
9b40: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
9b50: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
9b60: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
9b70: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
9b80: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
9b90: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
9ba0: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
9bb0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
9bc0: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
9bd0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
9be0: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
9bf0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
9c00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
9c10: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
9c20: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
9c30: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
9c40: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
9c50: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
9c60: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
9c70: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
9c80: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
9c90: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
9ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9cb0: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
9cc0: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
9cd0: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
9ce0: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
9cf0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
9d00: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
9d10: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
9d20: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
9d30: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
9d40: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
9d50: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
9d60: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
9d70: 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  >pList;    /* Th
9d80: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  e argument list 
9d90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
9da0: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
9db0: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
9dc0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9dd0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
9de0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
9df0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
9e00: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
9e10: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
9e20: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
9e30: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
9e40: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
9e50: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
9e60: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
9e70: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
9e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9e90: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
9ea0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
9eb0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9ec0: 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20      int auth;   
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
9ef0: 20 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63   to use the func
9f00: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
9f10: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
9f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9f30: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
9f40: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
9f50: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
9f60: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
9f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
9f80: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
9f90: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
9fa0: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
9fb0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
9fc0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
9fd0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
9fe0: 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  t enc = ENC(pPar
9ff0: 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65  se->db);  /* The
a000: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
a010: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64  ng */..      zId
a020: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
a030: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
a040: 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  nId = pExpr->tok
a050: 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  en.n;.      pDef
a060: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
a070: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
a080: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20  b, zId, nId, n, 
a090: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
a0a0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
a0b0: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
a0c0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
a0d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
a0e0: 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20  , nId, -1, enc, 
a0f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
a100: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
a110: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
a120: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
a130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a140: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
a150: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
a160: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a170: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
a180: 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20  ->xFunc==0;.    
a190: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
a1a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
a1b0: 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  ATION.      if( 
a1c0: 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  pDef ){.        
a1d0: 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41 75  auth = sqlite3Au
a1e0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
a1f0: 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c  SQLITE_FUNCTION,
a200: 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c   0, pDef->zName,
a210: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
a220: 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b   auth!=SQLITE_OK
a230: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a240: 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44  ( auth==SQLITE_D
a250: 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ENY ){.         
a260: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a270: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
a280: 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73  authorized to us
a290: 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c  e function: %s",
a2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65       pDef->zName
a2d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
a2e0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
a2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a300: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
a310: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _NULL;.         
a320: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
a330: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
a340: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 69 73  dif.      if( is
a350: 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c  _agg && !pNC->al
a360: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
a370: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a380: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
a390: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
a3a0: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
a3b0: 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20   nId,zId);.     
a3c0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
a3d0: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
a3e0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
a3f0: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
a400: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a410: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a420: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  se, "no such fun
a430: 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49  ction: %.*s", nI
a440: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
a450: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
a460: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
a470: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a  ong_num_args ){.
a480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a490: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
a4a0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
a4b0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
a4c0: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20  ction %.*s()",. 
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c              nId,
a4e0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
a4f0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
a500: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
a510: 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _agg ){.        
a520: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
a530: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
a540: 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67       pNC->hasAgg
a550: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
a560: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
a570: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
a580: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
a590: 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20  0; pNC->nErr==0 
a5a0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
a5b0: 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72        walkExprTr
a5c0: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ee(pList->a[i].p
a5d0: 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76  Expr, nameResolv
a5e0: 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20  erStep, pNC);.  
a5f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a600: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
a610: 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  lowAgg = 1;.    
a620: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f    /* FIX ME:  Co
a630: 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66  mpute pExpr->aff
a640: 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74  inity based on t
a650: 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75  he expected retu
a660: 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65  rn.      ** type
a670: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
a680: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
a690: 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a   return is_agg;.
a6a0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
a6b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a6c0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
a6d0: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
a6e0: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
a6f0: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  f.    case TK_IN
a700: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
a710: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
a720: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66          int nRef
a730: 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69   = pNC->nRef;.#i
a740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a750: 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20  T_CHECK.        
a760: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
a770: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
a780: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a790: 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73  arse,"subqueries
a7a0: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
a7b0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
a7c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ");.        }.#e
a7d0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
a7e0: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
a7f0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a800: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
a810: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a820: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
a830: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
a840: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
a850: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
a860: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
a870: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
a880: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a890: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
a8a0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
a8b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
a8c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
a8d0: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69  IABLE: {.      i
a8e0: 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20  f( pNC->isCheck 
a8f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a900: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a910: 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70 72  e,"parameters pr
a920: 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43  ohibited in CHEC
a930: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  K constraints");
a940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a950: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
a960: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
a970: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
a980: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
a990: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
a9a0: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
a9b0: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
a9c0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20  table columns.  
a9d0: 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72  Nodes of the for
a9e0: 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65  m ID.ID or ID re
a9f0: 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a  solve into an.**
aa00: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61   index to the ta
aa10: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
aa20: 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75   list and a colu
aa30: 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20  mn offset.  The 
aa40: 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20  .** Expr.opcode 
aa50: 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69  for such nodes i
aa60: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
aa70: 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70  COLUMN.  The Exp
aa80: 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  r.iTable.** valu
aa90: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
aaa0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
aab0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
aac0: 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a  e in pTabList.**
aad0: 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22   plus the "base"
aae0: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73   value.  The bas
aaf0: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74  e value will ult
ab00: 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74  imately become t
ab10: 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f  he.** VDBE curso
ab20: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63  r number for a c
ab30: 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
ab40: 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  inting into the 
ab50: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61  referenced.** ta
ab60: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
ab70: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  Column value is 
ab80: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
ab90: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
aba0: 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  mn .** of the re
abb0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20  ferenced table. 
abc0: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
abd0: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
abe0: 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44  special.** ROWID
abf0: 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20   column is -1.  
ac00: 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d  Any INTEGER PRIM
ac10: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
ac20: 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a  s tried as an.**
ac30: 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44   alias for ROWID
ac40: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73  ..**.** Also res
ac50: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
ac60: 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68  mes and check th
ac70: 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20  e functions for 
ac80: 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e  proper.** usage.
ac90: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20    Make sure all 
aca0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
acb0: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
acc0: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a  d all functions.
acd0: 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ** have the corr
ace0: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ect number of ar
acf0: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
ad00: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
ad10: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  .** in pParse->z
ad20: 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69  ErrMsg if anythi
ad30: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
ad40: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
ad50: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
ad60: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
ad70: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72  on contains aggr
ad80: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
ad90: 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f  then set the EP_
ada0: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
adb0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
adc0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
add0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
ade0: 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  s( .  NameContex
adf0: 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a  t *pNC,       /*
ae00: 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65   Namespace to re
ae10: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
ae20: 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20  s in. */.  Expr 
ae30: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
ae40: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
ae50: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
ae60: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  zed. */.){.  int
ae70: 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20   savedHasAgg;.  
ae80: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
ae90: 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c  eturn 0;.#if SQL
aea0: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
aeb0: 54 48 3e 30 0a 20 20 69 66 28 20 28 70 45 78 70  TH>0.  if( (pExp
aec0: 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e  r->nHeight+pNC->
aed0: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29  pParse->nHeight)
aee0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  >SQLITE_MAX_EXPR
aef0: 5f 44 45 50 54 48 20 29 7b 0a 20 20 20 20 73 71  _DEPTH ){.    sq
af00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 4e  lite3ErrorMsg(pN
af10: 43 2d 3e 70 50 61 72 73 65 2c 20 0a 20 20 20 20  C->pParse, .    
af20: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
af30: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
af40: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
af50: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 53 51 4c  %d)",.       SQL
af60: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
af70: 54 48 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 65  TH.    );.    re
af80: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 4e  turn 1;.  }.  pN
af90: 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67  C->pParse->nHeig
afa0: 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht += pExpr->nHe
afb0: 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ight;.#endif.  s
afc0: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
afd0: 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d  ->hasAgg;.  pNC-
afe0: 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77  >hasAgg = 0;.  w
aff0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
b000: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
b010: 74 65 70 2c 20 70 4e 43 29 3b 0a 23 69 66 20 53  tep, pNC);.#if S
b020: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
b030: 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50  EPTH>0.  pNC->pP
b040: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
b050: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
b060: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e  .#endif.  if( pN
b070: 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  C->nErr>0 ){.   
b080: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
b090: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
b0a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43  );.  }.  if( pNC
b0b0: 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  ->hasAgg ){.    
b0c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
b0d0: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a  pExpr, EP_Agg);.
b0e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65    }else if( save
b0f0: 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70  dHasAgg ){.    p
b100: 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a  NC->hasAgg = 1;.
b110: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70    }.  return Exp
b120: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
b130: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d  pr, EP_Error);.}
b140: 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ../*.** A pointe
b150: 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  r instance of th
b160: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
b170: 75 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66  used to pass inf
b180: 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f  ormation.** thro
b190: 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ugh walkExprTree
b1a0: 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65   into codeSubque
b1b0: 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70  ryStep()..*/.typ
b1c0: 65 64 65 66 20 73 74 72 75 63 74 20 51 75 65 72  edef struct Quer
b1d0: 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65  yCoder QueryCode
b1e0: 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79 43  r;.struct QueryC
b1f0: 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a  oder {.  Parse *
b200: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a  pParse;       /*
b210: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
b220: 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  text */.  NameCo
b230: 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f  ntext *pNC;    /
b240: 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66  * Namespace of f
b250: 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71  irst enclosing q
b260: 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a  uery */.};.../*.
b270: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b280: 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71   for scalar subq
b290: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 61  ueries used as a
b2a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
b2b0: 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  and IN operators
b2c0: 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a  .  Examples:.**.
b2d0: 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20 61  **     (SELECT a
b2e0: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20   FROM b)        
b2f0: 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a    -- subquery.**
b300: 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45 4c       EXISTS (SEL
b310: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
b320: 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75 65  -- EXISTS subque
b330: 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  ry.**     x IN (
b340: 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20 20  4,5,11)         
b350: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
b360: 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e  tor with list on
b370: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
b380: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45  .**     x IN (SE
b390: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
b3a0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
b3b0: 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79 20  r with subquery 
b3c0: 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a  on the right.**.
b3d0: 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61 72  ** The pExpr par
b3e0: 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65 73  ameter describes
b3f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b400: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
b410: 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  e IN.** operator
b420: 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f   or subquery..*/
b430: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b440: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f  OMIT_SUBQUERY.vo
b450: 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  id sqlite3CodeSu
b460: 62 73 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  bselect(Parse *p
b470: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
b480: 70 72 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41  pr){.  int testA
b490: 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ddr = 0;        
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b4b0: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
b4c0: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62  address */.  Vdb
b4d0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
b4e0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
b4f0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
b500: 72 6e 3b 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20  rn;...  /* This 
b510: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
b520: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
b530: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
b540: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
b550: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
b560: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
b570: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
b580: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
b590: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
b5a0: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
b5b0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
b5c0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
b5d0: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
b5e0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
b5f0: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
b600: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
b610: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
b620: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
b630: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
b640: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
b650: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
b660: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
b670: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
b680: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
b690: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
b6a0: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
b6b0: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
b6c0: 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f  ( !ExprHasAnyPro
b6d0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
b6e0: 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21 70  VarSelect) && !p
b6f0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
b700: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20   ){.    int mem 
b710: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
b720: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b730: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
b740: 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20  Load, mem, 0);. 
b750: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73 71     testAddr = sq
b760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b770: 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a  , OP_If, 0, 0);.
b780: 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73 74      assert( test
b790: 41 64 64 72 3e 30 20 7c 7c 20 73 71 6c 69 74 65  Addr>0 || sqlite
b7a0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
b7b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b7c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
b7d0: 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20  mInt, 1, mem);. 
b7e0: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45   }..  switch( pE
b7f0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
b800: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
b810: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
b820: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
b830: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
b840: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
b850: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
b860: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
b870: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
b880: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
b890: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
b8a0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
b8b0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
b8c0: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
b8d0: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
b8e0: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
b8f0: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
b900: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
b910: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
b920: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69 72   same way. A vir
b930: 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20  tual table is . 
b940: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
b950: 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
b960: 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
b970: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
b980: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
b990: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
b9a0: 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
b9b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
b9c0: 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
b9d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
b9e0: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
b9f0: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
ba00: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
ba10: 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
ba20: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
ba30: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
ba40: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
ba50: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
ba60: 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
ba70: 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
ba80: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
ba90: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
baa0: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
bab0: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
bac0: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
bad0: 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
bae0: 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
baf0: 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
bb00: 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
bb10: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
bb20: 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
bb30: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
bb40: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
bb50: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
bb60: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
bb70: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
bb80: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
bb90: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
bba0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
bbb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bbc0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
bbd0: 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ral, pExpr->iTab
bbe0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65  le, 0);.      me
bbf0: 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30  mset(&keyInfo, 0
bc00: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f  , sizeof(keyInfo
bc10: 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66  ));.      keyInf
bc20: 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20  o.nField = 1;.  
bc30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc40: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
bc50: 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d  mColumns, pExpr-
bc60: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20  >iTable, 1);..  
bc70: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
bc80: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
bc90: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
bca0: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
bcb0: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
bcc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
bcd0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
bce0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
bcf0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
bd00: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
bd10: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
bd20: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
bd30: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
bd40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
bd50: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70  int iParm = pExp
bd60: 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28  r->iTable +  (((
bd70: 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31  int)affinity)<<1
bd80: 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  6);.        Expr
bd90: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
bda0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
bdb0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
bdc0: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
bdd0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
bde0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
bdf0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
be00: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
be10: 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _Set, iParm, 0, 
be20: 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  0, 0, 0) ){.    
be30: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
be40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
be50: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
be60: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
be70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c  .        if( pEL
be80: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
be90: 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20  Expr>0 ){ .     
bea0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
beb0: 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f  ll[0] = binaryCo
bec0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
bed0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
bee0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
bef0: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
bf00: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
bf10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bf20: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
bf30: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
bf40: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
bf50: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
bf60: 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63    **..** For eac
bf70: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
bf80: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
bf90: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
bfa0: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
bfb0: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
bfc0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
bfd0: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
bfe0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
bff0: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
c000: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
c010: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
c020: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
c030: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
c040: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
c050: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
c060: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
c070: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
c080: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
c090: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
c0a0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
c0b0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
c0c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
c0d0: 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  m;..        if( 
c0e0: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
c0f0: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
c100: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
c110: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
c120: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
c130: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
c140: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
c150: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
c160: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
c170: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
c180: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
c190: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
c1a0: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
c1b0: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
c1c0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
c1d0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
c1e0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
c1f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
c200: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
c210: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
c220: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
c230: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
c240: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
c250: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
c260: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
c270: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
c280: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
c290: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
c2a0: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
c2b0: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
c2c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
c2d0: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
c2e0: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
c2f0: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
c300: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c310: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
c320: 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  >0 && !sqlite3Ex
c330: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
c340: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
c350: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
c360: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74  geToNoop(v, test
c370: 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20  Addr-1, 3);.    
c380: 20 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72          testAddr
c390: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
c3a0: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
c3b0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
c3c0: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
c3d0: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
c3e0: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
c3f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c400: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c410: 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  E2);.          s
c420: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
c430: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
c440: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
c450: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
c460: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c470: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
c480: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
c490: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
c4a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c4b0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
c4c0: 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
c4d0: 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )&keyInfo, P3_KE
c4e0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72  YINFO);.      br
c4f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
c500: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
c510: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
c520: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
c530: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
c540: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
c550: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
c560: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
c570: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
c580: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
c590: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
c5a0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
c5b0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
c5c0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
c5d0: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
c5e0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
c5f0: 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20  t Token one = { 
c600: 28 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d  (u8*)"1", 0, 1 }
c610: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
c620: 70 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  pSel;.      int 
c630: 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  iMem;.      int 
c640: 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70  sop;..      pExp
c650: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65  r->iColumn = iMe
c660: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
c670: 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  ++;.      pSel =
c680: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
c690: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
c6a0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
c6b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d  ){.        sop =
c6c0: 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
c6d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c6e0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c  Op(v, OP_MemNull
c6f0: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
c700: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c710: 28 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71  (v, "# Init subq
c720: 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
c730: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c740: 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45       sop = SRT_E
c750: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
c760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c770: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
c780: 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   iMem);.        
c790: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c7a0: 22 23 20 49 6e 69 74 20 45 58 49 53 54 53 20 72  "# Init EXISTS r
c7b0: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
c7c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
c7d0: 78 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  xprDelete(pSel->
c7e0: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
c7f0: 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
c800: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54  lite3Expr(TK_INT
c810: 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65  EGER, 0, 0, &one
c820: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
c830: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c840: 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d  e, pSel, sop, iM
c850: 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 20  em, 0, 0, 0, 0) 
c860: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c870: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
c880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c890: 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64 64  }..  if( testAdd
c8a0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
c8b0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c8c0: 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a 0a  testAddr);.  }..
c8d0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
c8e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c8f0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
c900: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
c910: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
c920: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
c930: 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
c940: 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
c950: 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63  n-1] on the stac
c960: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
c970: 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64  d codeInteger(Vd
c980: 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
c990: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
c9a0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73 71 6c  int i;.  if( sql
c9b0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20  ite3GetInt32(z, 
c9c0: 26 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  &i) ){.    sqlit
c9d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c9e0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
c9f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
ca00: 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74  lite3FitsIn64Bit
ca10: 73 28 7a 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  s(z) ){.    sqli
ca20: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
ca30: 5f 49 6e 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c  _Int64, 0, 0, z,
ca40: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
ca50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ca60: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
ca70: 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a  0, z, n);.  }.}.
ca80: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ca90: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
caa0: 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c  extract the iCol
cab0: 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72  umn-th column fr
cac0: 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62  om.** table pTab
cad0: 20 61 6e 64 20 70 75 73 68 20 74 68 61 74 20 63   and push that c
cae0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 6e 20 74  olumn value on t
caf0: 68 65 20 73 74 61 63 6b 2e 20 20 54 68 65 72 65  he stack.  There
cb00: 0a 2a 2a 20 69 73 20 61 6e 20 6f 70 65 6e 20 63  .** is an open c
cb10: 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
cb20: 20 69 54 61 62 6c 65 2e 20 20 49 66 20 69 43 6f   iTable.  If iCo
cb30: 6c 75 6d 6e 3c 30 20 74 68 65 6e 0a 2a 2a 20 63  lumn<0 then.** c
cb40: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
cb50: 20 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74   that extracts t
cb60: 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  he rowid..*/.voi
cb70: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
cb80: 65 47 65 74 43 6f 6c 75 6d 6e 28 56 64 62 65 20  eGetColumn(Vdbe 
cb90: 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  *v, Table *pTab,
cba0: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 69 6e   int iColumn, in
cbb0: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 66 28  t iTable){.  if(
cbc0: 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20   iColumn<0 ){.  
cbd0: 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62    int op = (pTab
cbe0: 20 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 54   && IsVirtual(pT
cbf0: 61 62 29 29 20 3f 20 4f 50 5f 56 52 6f 77 69 64  ab)) ? OP_VRowid
cc00: 20 3a 20 4f 50 5f 52 6f 77 69 64 3b 0a 20 20 20   : OP_Rowid;.   
cc10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cc20: 70 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c  p(v, op, iTable,
cc30: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
cc40: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
cc50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc60: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
cc70: 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b  Table, iColumn);
cc80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
cc90: 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
cca0: 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
ccb0: 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
ccc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ccd0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54 61  AddOp(v, op, iTa
cce0: 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 20  ble, iColumn);. 
ccf0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
cd00: 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
cd10: 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64   iColumn);.#ifnd
cd20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
cd30: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
cd40: 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
cd50: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
cd60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
cd70: 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  EAL ){.      sql
cd80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cd90: 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
cda0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
cdb0: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
cdc0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cdd0: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
cde0: 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
cdf0: 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
ce00: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c  expression and l
ce10: 65 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20  eave the result 
ce20: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74  on the top of st
ce30: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
ce40: 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
ce50: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
ce60: 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
ce70: 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
ce80: 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
ce90: 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
cea0: 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
ceb0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
cec0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
ced0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
cee0: 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
cef0: 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
cf00: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
cf10: 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
cf20: 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
cf30: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
cf40: 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
cf50: 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
cf60: 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
cf70: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
cf80: 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
cf90: 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
cfa0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
cfb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
cfc0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
cfd0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
cfe0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b  pVdbe;.  int op;
cff0: 0a 20 20 69 6e 74 20 73 74 61 63 6b 43 68 6e 67  .  int stackChng
d000: 20 3d 20 31 3b 20 20 20 20 2f 2a 20 41 6d 6f 75   = 1;    /* Amou
d010: 6e 74 20 6f 66 20 63 68 61 6e 67 65 20 74 6f 20  nt of change to 
d020: 73 74 61 63 6b 20 64 65 70 74 68 20 2a 2f 0a 0a  stack depth */..
d030: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
d040: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
d050: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
d060: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d070: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  P_Null, 0, 0);. 
d080: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
d090: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
d0a0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
d0b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
d0c0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
d0d0: 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
d0e0: 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
d0f0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
d100: 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
d110: 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
d120: 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
d130: 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
d140: 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
d150: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
d160: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d170: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
d180: 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  pCol->iMem, 0);.
d190: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d1a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
d1b0: 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74  AggInfo->useSort
d1c0: 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ingIdx ){.      
d1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d1e0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
d1f0: 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
d200: 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
d230: 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  erColumn);.     
d240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d250: 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  }.      /* Other
d260: 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20  wise, fall thru 
d270: 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55  into the TK_COLU
d280: 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  MN case */.    }
d290: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
d2a0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
d2b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
d2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
d2d0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
d2e0: 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65   when coding che
d2f0: 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ck constraints *
d300: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
d310: 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  ( pParse->ckOffs
d320: 65 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  et>0 );.        
d330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d340: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 70 50 61 72  (v, OP_Dup, pPar
d350: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 2d 70 45 78  se->ckOffset-pEx
d360: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31  pr->iColumn-1, 1
d370: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d380: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
d390: 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
d3a0: 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  (v, pExpr->pTab,
d3b0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
d3c0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
d3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d3e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d3f0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
d400: 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
d410: 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29 70  eger(v, (char*)p
d420: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
d430: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
d440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d450: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
d460: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
d470: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
d480: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f    assert( TK_FLO
d490: 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20  AT==OP_Real );. 
d4a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
d4b0: 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e  STRING==OP_Strin
d4c0: 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g8 );.      sqli
d4d0: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
d4e0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
d4f0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f  ite3VdbeOp3(v, o
d500: 70 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  p, 0, 0, (char*)
d510: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
d520: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
d530: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d540: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
d550: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
d560: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d570: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
d580: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d590: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
d5a0: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
d5b0: 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
d5c0: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
d5d0: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
d5e0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
d5f0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f    assert( TK_BLO
d600: 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b  B==OP_HexBlob );
d610: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72  .      n = pExpr
d620: 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20  ->token.n - 3;. 
d630: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29       z = (char*)
d640: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b  pExpr->token.z +
d650: 20 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   2;.      assert
d660: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( n>=0 );.      
d670: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
d680: 20 20 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20      z = "";.    
d690: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d6a0: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
d6b0: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  0, 0, z, n);.   
d6c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d6d0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
d6e0: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
d6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d700: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69  AddOp(v, OP_Vari
d710: 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61  able, pExpr->iTa
d720: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ble, 0);.      i
d730: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
d740: 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  n>1 ){.        s
d750: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d760: 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P3(v, -1, (char*
d770: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
d780: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
d790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d7a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d7b0: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
d7c0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
d7d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d7e0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
d7f0: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
d800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d810: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d820: 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
d830: 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
d840: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
d850: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
d860: 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
d870: 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
d880: 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a  int aff, to_op;.
d890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d8a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
d8b0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
d8c0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
d8d0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
d8e0: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  xpr->token);.   
d8f0: 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d     to_op = aff -
d900: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
d910: 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20   + OP_ToText;.  
d920: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
d930: 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
d940: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
d950: 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
d960: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
d970: 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20  p==OP_ToBlob    
d980: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
d990: 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20  FF_NONE    );.  
d9a0: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
d9b0: 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
d9c0: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
d9d0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
d9e0: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
d9f0: 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20  p==OP_ToInt     
da00: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
da10: 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
da20: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
da30: 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20  p==OP_ToReal    
da40: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
da50: 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20  FF_REAL    );.  
da60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da70: 64 64 4f 70 28 76 2c 20 74 6f 5f 6f 70 2c 20 30  ddOp(v, to_op, 0
da80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
da90: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
daa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
dab0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dac0: 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
dad0: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
dae0: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
daf0: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
db00: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
db10: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
db20: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
db30: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
db40: 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
db50: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
db60: 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
db70: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
db80: 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
db90: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
dba0: 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
dbb0: 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
dbc0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
dbd0: 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
dbe0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
dbf0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
dc00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
dc10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
dc20: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
dc30: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
dc40: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
dc50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
dc60: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
dc70: 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  ht, op, 0, 0);. 
dc80: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
dc90: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
dca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
dcb0: 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
dcc0: 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
dcd0: 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
dce0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
dcf0: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
dd00: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
dd10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
dd20: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
dd30: 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
dd40: 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
dd50: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
dd60: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
dd70: 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
dd80: 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
dd90: 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
dda0: 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
ddb0: 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
ddc0: 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
ddd0: 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
dde0: 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
ddf0: 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
de00: 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
de10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
de20: 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
de30: 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
de40: 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
de50: 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
de60: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
de70: 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
de80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
de90: 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
dea0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
deb0: 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
dec0: 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
ded0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
dee0: 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
def0: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
df00: 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
df10: 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
df20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
df30: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
df40: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
df50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
df60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
df70: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
df80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
df90: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
dfa0: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
dfb0: 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
dfc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
dfd0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
dfe0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
dff0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
e000: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
e010: 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
e020: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
e030: 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70  OAT || pLeft->op
e040: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
e050: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70          Token *p
e060: 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e   = &pLeft->token
e070: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
e080: 7a 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  z = sqlite3MPrin
e090: 74 66 28 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e  tf("-%.*s", p->n
e0a0: 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  , p->z);.       
e0b0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
e0c0: 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
e0d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e0e0: 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  eOp3(v, OP_Real,
e0f0: 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31   0, 0, z, p->n+1
e100: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e110: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65  {.          code
e120: 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d  Integer(v, z, p-
e130: 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  >n+1);.        }
e140: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
e150: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  ree(z);.        
e160: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
e170: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
e180: 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54  ough into TK_NOT
e190: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
e1a0: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
e1b0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
e1c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e1d0: 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
e1e0: 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Not );.      ass
e1f0: 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
e200: 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Not );.      sql
e210: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e220: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e230: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e240: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
e250: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
e260: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
e270: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e280: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
e290: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
e2a0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
e2b0: 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20    int dest;.    
e2c0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
e2d0: 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
e2e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e2f0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
e300: 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
e310: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e320: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
e330: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
e340: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e350: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e360: 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d  t);.      dest =
e370: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e380: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a  entAddr(v) + 2;.
e390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e3a0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
e3b0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
e3c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e3d0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
e3e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
e3f0: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
e400: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e410: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
e420: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
e430: 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
e440: 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
e450: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
e460: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
e470: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e480: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
e490: 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22  f aggregate: %T"
e4a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70  ,.            &p
e4b0: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
e4c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e4d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e4e0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
e4f0: 2c 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  , pInfo->aFunc[p
e500: 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
e510: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
e520: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e530: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
e540: 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73  ST_FUNC:.    cas
e550: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
e560: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
e570: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
e580: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
e590: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f   nExpr = pList ?
e5a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
e5b0: 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  0;.      FuncDef
e5c0: 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e   *pDef;.      in
e5d0: 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e  t nId;.      con
e5e0: 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20  st char *zId;.  
e5f0: 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73      int constMas
e600: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  k = 0;.      int
e610: 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63   i;.      u8 enc
e620: 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
e630: 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  b);.      CollSe
e640: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
e650: 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a      zId = (char*
e660: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b  )pExpr->token.z;
e670: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
e680: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
e690: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
e6a0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
e6b0: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
e6c0: 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20  Id, nExpr, enc, 
e6d0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
e6e0: 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20  ( pDef!=0 );.   
e6f0: 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74     nExpr = sqlit
e700: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
e710: 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
e720: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
e730: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
e740: 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73  BLE.      /* Pos
e750: 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74  sibly overload t
e760: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74  he function if t
e770: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
e780: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  t is.      ** a 
e790: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  virtual table co
e7a0: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lumn..      **. 
e7b0: 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69       ** For infi
e7c0: 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b  x functions (LIK
e7d0: 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c  E, GLOB, REGEXP,
e7e0: 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20   and MATCH) use 
e7f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
e800: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f  ond argument, no
e810: 74 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20  t the first, as 
e820: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
e830: 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  test to.      **
e840: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20   see if it is a 
e850: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74  column in a virt
e860: 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ual table.  This
e870: 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65   is done because
e880: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65  .      ** the le
e890: 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  ft operand of in
e8a0: 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74  fix functions (t
e8b0: 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61  he operand we wa
e8c0: 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  nt to.      ** c
e8d0: 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69  ontrol overloadi
e8e0: 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74  ng) ends up as t
e8f0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
e900: 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  nt to the.      
e910: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ** function.  Th
e920: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20  e expression "A 
e930: 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76  glob B" is equiv
e940: 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20  alent to .      
e950: 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20  ** "glob(B,A).  
e960: 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74  We want to use t
e970: 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20  he A in "A glob 
e980: 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20  B" to test.     
e990: 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e   ** for function
e9a0: 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42   overloading.  B
e9b0: 75 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20  ut we use the B 
e9c0: 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c  term in "glob(B,
e9d0: 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  A)"..      */.  
e9e0: 20 20 20 20 69 66 28 20 6e 45 78 70 72 3e 3d 32      if( nExpr>=2
e9f0: 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67   && (pExpr->flag
ea00: 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63  s & EP_InfixFunc
ea10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  ) ){.        pDe
ea20: 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
ea30: 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
ea40: 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70 4c 69  pDef, nExpr, pLi
ea50: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
ea60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ea70: 20 6e 45 78 70 72 3e 30 20 29 7b 0a 20 20 20 20   nExpr>0 ){.    
ea80: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
ea90: 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
eaa0: 6e 63 74 69 6f 6e 28 70 44 65 66 2c 20 6e 45 78  nction(pDef, nEx
eab0: 70 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr, pList->a[0].
eac0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
ead0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
eae0: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
eaf0: 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<32; i++){.   
eb00: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
eb10: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
eb20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
eb30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
eb40: 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c  onstMask |= (1<<
eb50: 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
eb60: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
eb70: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21  needCollSeq && !
eb80: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
eb90: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
eba0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ebb0: 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
ebc0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
ebd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ebe0: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
ebf0: 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
ec00: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
ec10: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
ec20: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
ec30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ec40: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
ec50: 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
ec60: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
ec70: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
ec80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ec90: 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  eOp3(v, OP_Funct
eca0: 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
ecb0: 6e 45 78 70 72 2c 20 28 63 68 61 72 2a 29 70 44  nExpr, (char*)pD
ecc0: 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b  ef, P3_FUNCDEF);
ecd0: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
ece0: 20 3d 20 31 2d 6e 45 78 70 72 3b 0a 20 20 20 20   = 1-nExpr;.    
ecf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
ed00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ed10: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
ed20: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
ed30: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
ed40: 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  CT: {.      if( 
ed50: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
ed60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
ed70: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
ed80: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  t(pParse, pExpr)
ed90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
eda0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
edb0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
edc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
edd0: 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
ede0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61  mment((v, "# loa
edf0: 64 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  d subquery resul
ee00: 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  t"));.      brea
ee10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ee20: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
ee30: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
ee40: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
ee50: 20 20 20 20 20 20 69 6e 74 20 63 6b 4f 66 66 73        int ckOffs
ee60: 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f  et = pParse->ckO
ee70: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 73 71 6c  ffset;.      sql
ee80: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
ee90: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  t(pParse, pExpr)
eea0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  ;..      /* Figu
eeb0: 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
eec0: 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
eed0: 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
eee0: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
eef0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
ef00: 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
ef10: 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
ef20: 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
ef30: 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ble for.      **
ef40: 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P3 of OP_MakeRe
ef50: 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cord..      */. 
ef60: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
ef70: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
ef80: 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  ty(pExpr);..    
ef90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
efa0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
efb0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
efc0: 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
efd0: 3d 20 63 6b 4f 66 66 73 65 74 2b 31 3b 0a 0a 20  = ckOffset+1;.. 
efe0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
eff0: 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
f000: 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20  xpr> IN (...)". 
f010: 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  The temporary ta
f020: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78  ble.      ** pEx
f030: 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61  pr->iTable conta
f040: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
f050: 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
f060: 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20  (...) set..     
f070: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
f080: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f090: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
f0a0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
f0b0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f0c0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
f0d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f0e0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
f0f0: 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20  1, addr+4);     
f100: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b         /* addr +
f110: 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69   0 */.      sqli
f120: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f130: 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20  OP_Pop, 2, 0);. 
f140: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f150: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
f160: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
f170: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f180: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
f190: 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71  ddr+7);.      sq
f1a0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
f1b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
f1c0: 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20  , 0, &affinity, 
f1d0: 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b 20  1);   /* addr + 
f1e0: 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  4 */.      sqlit
f1f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f200: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
f210: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b  iTable, addr+7);
f220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f230: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
f240: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20  dImm, -1, 0);   
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f260: 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20  * addr + 6 */.. 
f270: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f280: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
f290: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
f2a0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
f2b0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
f2c0: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
f2d0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
f2e0: 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Item = pExpr->pL
f2f0: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78  ist->a;.      Ex
f300: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49  pr *pRight = pLI
f310: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
f320: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f330: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
f340: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f350: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
f360: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
f370: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f380: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
f390: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
f3a0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
f3b0: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
f3c0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
f3d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f3e0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
f3f0: 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b  );.      pLItem+
f400: 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  +;.      pRight 
f410: 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
f420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f430: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f440: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
f450: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
f460: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
f470: 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20   OP_Le, 0, 0);. 
f480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f490: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c  AddOp(v, OP_And,
f4a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
f4b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f4c0: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20  ase TK_UPLUS:.  
f4d0: 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
f4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f4f0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f500: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
f510: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
f520: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f530: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f540: 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69  _CASE: {.      i
f550: 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  nt expr_end_labe
f560: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d  l;.      int jum
f570: 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pInst;.      int
f580: 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e   nExpr;.      in
f590: 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  t i;.      ExprL
f5a0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
f5b0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
f5c0: 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
f5d0: 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  em;..      asser
f5e0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  t(pExpr->pList);
f5f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
f600: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
f610: 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
f620: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
f630: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
f640: 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69  > 0);.      pELi
f650: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
f660: 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c  t;.      aListel
f670: 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  em = pEList->a;.
f680: 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
f690: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
f6a0: 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65     expr_end_labe
f6b0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
f6c0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f6d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
f6e0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
f6f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f700: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
f710: 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eft);.      }.  
f720: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f730: 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  Expr; i=i+2){.  
f740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f750: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c  rCode(pParse, aL
f760: 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
f770: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f780: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
f790: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f7a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f7b0: 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  Dup, 1, 1);.    
f7c0: 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d        jumpInst =
f7d0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
f7e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f7f0: 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e  t, aListelem[i].
f800: 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30          OP_Ne, 0
f830: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
f840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f850: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
f860: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f870: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70  {.          jump
f880: 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Inst = sqlite3Vd
f890: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
f8a0: 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Not, 1, 0);.    
f8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
f8c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f8d0: 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
f8e0: 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  i+1].pExpr);.   
f8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f900: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
f910: 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  , 0, expr_end_la
f920: 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
f930: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f940: 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b 0a  e(v, jumpInst);.
f950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f960: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
f970: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f980: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f990: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
f9a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
f9b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
f9c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
f9d0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f9e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
f9f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fa00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
fa20: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
fa30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fa40: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
fa50: 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
fa60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
fa70: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
fa80: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
fa90: 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
faa0: 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ISE: {.      if(
fab0: 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
fac0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
fad0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fae0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
fb00: 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
fb10: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
fb20: 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
fb30: 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  ");..return;.   
fb40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
fb50: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f  Expr->iColumn!=O
fb60: 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
fb70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
fb80: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f  pr->iColumn==OE_
fb90: 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20  Rollback ||.    
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
fbb0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
fbc0: 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20  E_Abort ||.     
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
fbe0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
fbf0: 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Fail );.       
fc00: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
fc10: 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20  Expr(pExpr);.   
fc20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fc30: 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  eOp3(v, OP_Halt,
fc40: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
fc50: 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  NT, pExpr->iColu
fc60: 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
fc80: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
fc90: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
fca0: 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n);.      } else
fcb0: 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
fcc0: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
fcd0: 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20  mn == OE_Ignore 
fce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
fcf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
fd00: 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
fd10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73  , 0);.         s
fd20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fd30: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
fd40: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
fd50: 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20  ->ignoreJump);. 
fd60: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
fd70: 65 6e 74 28 28 76 2c 20 22 23 20 72 61 69 73 65  ent((v, "# raise
fd80: 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20  (IGNORE)"));.   
fd90: 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 63 6b     }.      stack
fda0: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
fdb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
fdc0: 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
fdd0: 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
fde0: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  ){.    pParse->c
fdf0: 6b 4f 66 66 73 65 74 20 2b 3d 20 73 74 61 63 6b  kOffset += stack
fe00: 43 68 6e 67 3b 0a 20 20 20 20 61 73 73 65 72 74  Chng;.    assert
fe10: 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  ( pParse->ckOffs
fe20: 65 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  et );.  }.}..#if
fe30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fe40: 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47  _TRIGGER./*.** G
fe50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
fe60: 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67  t evalutes the g
fe70: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
fe80: 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20 72  and leaves the r
fe90: 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20  esult.** on the 
fea0: 73 74 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f  stack.  See also
feb0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
fec0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ()..**.** This r
fed0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73  outine might als
fee0: 6f 20 63 61 63 68 65 20 74 68 65 20 72 65 73 75  o cache the resu
fef0: 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68  lt and modify th
ff00: 65 20 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20  e pExpr tree.** 
ff10: 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
ff20: 6d 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20  make use of the 
ff30: 63 61 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e  cached result on
ff40: 20 73 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c   subsequent eval
ff50: 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65  uations.** rathe
ff60: 72 20 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20  r than evaluate 
ff70: 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73  the whole expres
ff80: 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69  sion again.  Tri
ff90: 76 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  vial expressions
ffa0: 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68   are.** not cach
ffb0: 65 64 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ed.  If the expr
ffc0: 65 73 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64  ession is cached
ffd0: 2c 20 69 74 73 20 72 65 73 75 6c 74 20 69 73 20  , its result is 
ffe0: 73 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20  stored in a .** 
fff0: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  memory location.
10000 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10010 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
10020 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10030 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
10040 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
10050 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
10060 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  Mem;.  int addr1
10070 2c 20 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76  , addr2;.  if( v
10080 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10090 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
100a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
100b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
100c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
100d0 70 72 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73  pr);.  addr2 = s
100e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
100f0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
10100 61 64 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c  addr2>addr1+1 ||
10110 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
10120 70 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63  p(v, addr1)->opc
10130 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
10140 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70   ){.    iMem = p
10150 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
10160 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
10170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10180 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
10190 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  re, iMem, 0);.  
101a0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
101b0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d  _REGISTER;.  }.}
101c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
101d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
101e0 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
101f0 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
10200 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
10210 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
10220 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ist onto the sta
10230 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
10240 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
10250 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f  lements pushed o
10260 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a  nto the stack..*
10270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
10280 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
10290 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
102a0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
102b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
102c0 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f  List *pList    /
102d0 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
102e0 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
102f0 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  d */.){.  struct
10300 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
10310 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
10320 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  n;.  if( pList==
10330 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10340 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
10350 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
10360 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30  ist->a, i=n; i>0
10370 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
10380 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
10390 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74  Code(pParse, pIt
103a0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  em->pExpr);.  }.
103b0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
103c0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
103d0 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
103e0 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
103f0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
10400 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
10410 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
10420 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10430 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
10440 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
10450 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
10460 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10470 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
10480 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
10490 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
104a0 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
104b0 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
104c0 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
104d0 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
104e0 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74  IfNull flag is t
104f0 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rue..**.** This 
10500 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
10510 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
10520 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
10530 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
10540 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
10550 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
10560 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
10570 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
10580 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
10590 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
105a0 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
105b0 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
105c0 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
105d0 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
105e0 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
105f0 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
10600 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
10610 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
10620 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
10630 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
10640 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
10650 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
10660 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
10670 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10680 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
10690 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
106a0 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
106b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
106c0 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
106d0 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20  .  int ckOffset 
106e0 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  = pParse->ckOffs
106f0 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c  et;.  if( v==0 |
10700 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
10710 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70  urn;.  op = pExp
10720 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
10730 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
10740 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
10750 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
10760 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10770 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10780 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
10790 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
107a0 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c   d2, !jumpIfNull
107b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
107c0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
107d0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
107e0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
107f0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
10800 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
10810 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
10820 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10830 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
10840 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10850 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
10860 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
10870 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
10880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10890 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
108a0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
108b0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
108c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
108d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
108e0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
108f0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
10900 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
10910 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
10920 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
10930 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10940 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
10950 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
10960 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
10970 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
10980 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
10990 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
109a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
109b0 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20  _LT==OP_Lt );.  
109c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
109d0 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20  E==OP_Le );.    
109e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d    assert( TK_GT=
109f0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Gt );.      
10a00 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f  assert( TK_GE==O
10a10 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Ge );.      as
10a20 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f  sert( TK_EQ==OP_
10a30 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
10a40 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65  rt( TK_NE==OP_Ne
10a50 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10a60 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10a70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
10a80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10a90 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10aa0 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
10ab0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
10ac0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10ad0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
10ae0 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20  ight, op, dest, 
10af0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
10b00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10b10 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
10b20 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
10b30 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
10b40 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55   assert( TK_ISNU
10b50 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b  LL==OP_IsNull );
10b60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
10b70 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
10b80 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73  tNull );.      s
10b90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10ba0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10bb0 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
10bc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10bd0 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
10be0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10bf0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
10c00 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
10c10 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
10c20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
10c30 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74   z" is implement
10c40 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
10c50 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78        ** 1 IF (x
10c60 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20   < y) GOTO 3.   
10c70 20 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d     ** 2 IF (x <=
10c80 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a   z) GOTO <dest>.
10c90 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20        ** 3 .... 
10ca0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
10cb0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78  t addr;.      Ex
10cc0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
10cd0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
10ce0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
10cf0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
10d00 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
10d10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10d20 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
10d30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10d40 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
10d50 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
10d60 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10d70 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
10d80 20 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65       addr = code
10d90 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
10da0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
10db0 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66  P_Lt, 0, !jumpIf
10dc0 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52  Null);..      pR
10dd0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
10de0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
10df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10e00 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10e10 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
10e20 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
10e30 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
10e40 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75   OP_Le, dest, ju
10e50 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
10e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10e70 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10e80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
10e90 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10ea0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
10eb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10ec0 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
10ed0 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
10ee0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
10ef0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
10f00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10f10 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
10f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10f30 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a  ddOp(v, OP_If, j
10f40 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
10f50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10f60 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
10f70 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b  e->ckOffset = ck
10f80 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Offset;.}../*.**
10f90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
10fa0 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
10fb0 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
10fc0 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
10fd0 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
10fe0 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
10ff0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
11000 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
11010 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
11020 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
11030 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
11040 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
11050 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
11060 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
11070 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
11080 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
11090 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
110a0 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20  Null is true or 
110b0 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
110c0 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61  jumpIfNull is fa
110d0 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lse..*/.void sql
110e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
110f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
11100 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
11110 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
11120 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
11130 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
11140 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
11150 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d    int ckOffset =
11160 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
11170 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c  t;.  if( v==0 ||
11180 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
11190 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61  rn;..  /* The va
111a0 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  lue of pExpr->op
111b0 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61   and op are rela
111c0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
111d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
111e0 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
111f0 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20       op.  **    
11200 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20     ---------    
11210 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
11220 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49  .  **       TK_I
11230 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f  SNULL          O
11240 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20  P_NotNull.  **  
11250 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20       TK_NOTNULL 
11260 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c          OP_IsNul
11270 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  l.  **       TK_
11280 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NE              
11290 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Eq.  **      
112a0 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20   TK_EQ          
112b0 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20      OP_Ne.  **  
112c0 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20       TK_GT      
112d0 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20          OP_Le.  
112e0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20  **       TK_LE  
112f0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47              OP_G
11300 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
11310 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GE              
11320 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Lt.  **      
11330 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20   TK_LT          
11340 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20      OP_Ge.  **. 
11350 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61   ** For other va
11360 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f  lues of pExpr->o
11370 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e  p, op is undefin
11380 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20  ed and unused.. 
11390 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   ** The value of
113a0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
113b0 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e  stants are arran
113c0 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65  ged such that we
113d0 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74  .  ** can comput
113e0 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62  e the mapping ab
113f0 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f  ove using the fo
11400 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69  llowing expressi
11410 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28  on..  ** Assert(
11420 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74  )s verify that t
11430 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
11440 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a  s correct..  */.
11450 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e    op = ((pExpr->
11460 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  op+(TK_ISNULL&1)
11470 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26  )^1)-(TK_ISNULL&
11480 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  1);..  /* Verify
11490 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65   correct alignme
114a0 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  nt of TK_ and OP
114b0 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f  _ constants.  */
114c0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
114d0 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
114e0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  || op==OP_NotNul
114f0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
11500 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54  Expr->op!=TK_NOT
11510 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49  NULL || op==OP_I
11520 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  sNull );.  asser
11530 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
11540 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71  _NE || op==OP_Eq
11550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
11560 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c  xpr->op!=TK_EQ |
11570 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  | op==OP_Ne );. 
11580 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
11590 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d  op!=TK_LT || op=
115a0 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ge );.  asse
115b0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
115c0 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LE || op==OP_G
115d0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
115e0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20  Expr->op!=TK_GT 
115f0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
11600 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
11610 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70  >op!=TK_GE || op
11620 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77  ==OP_Lt );..  sw
11630 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
11640 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
11650 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ND: {.      sqli
11660 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
11670 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
11680 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
11690 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
116a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
116b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
116c0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
116d0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
116e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
116f0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
11700 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
11710 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11720 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
11730 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
11740 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
11750 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49  Left, d2, !jumpI
11760 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
11770 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
11780 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
11790 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
117a0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
117b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
117c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
117d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
117e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
117f0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
11800 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
11810 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
11820 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
11830 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
11840 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
11850 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
11860 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
11870 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
11880 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
11890 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
118a0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
118b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
118c0 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
118d0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
118e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
118f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
11900 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
11910 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
11920 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
11930 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
11940 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  p, dest, jumpIfN
11950 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
11960 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11970 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
11980 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
11990 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
119a0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
119b0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
119c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
119d0 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
119e0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
119f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11a00 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
11a10 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
11a20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78  expression is "x
11a30 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
11a40 22 2e 20 49 74 20 69 73 20 69 6d 70 6c 65 6d 65  ". It is impleme
11a50 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a  nted as:.      *
11a60 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20  *.      ** 1 IF 
11a70 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a  (x >= y) GOTO 3.
11a80 20 20 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20        ** 2 GOTO 
11a90 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20  <dest>.      ** 
11aa0 33 20 49 46 20 28 78 20 3e 20 7a 29 20 47 4f 54  3 IF (x > z) GOT
11ab0 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a  O <dest>.      *
11ac0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
11ad0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
11ae0 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
11af0 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
11b00 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
11b10 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
11b20 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
11b30 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11b40 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
11b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11b60 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
11b70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11b80 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11b90 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
11ba0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
11bb0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
11bc0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
11bd0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
11be0 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
11bf0 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66   addr+3, !jumpIf
11c00 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71  Null);..      sq
11c10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11c20 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
11c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11c40 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
11c50 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
11c60 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
11c70 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
11c80 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
11c90 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
11ca0 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
11cb0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
11cc0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
11cd0 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65  Right, OP_Gt, de
11ce0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
11cf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11d00 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
11d10 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
11d20 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11d30 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
11d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11d50 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d  v, OP_IfNot, jum
11d60 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a  pIfNull, dest);.
11d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d80 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
11d90 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66  >ckOffset = ckOf
11da0 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  fset;.}../*.** D
11db0 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
11dc0 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
11dd0 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
11de0 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
11df0 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20  ero).** if they 
11e00 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  are identical an
11e10 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69  d return FALSE i
11e20 66 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e  f they differ in
11e30 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
11e40 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
11e50 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
11e60 72 6e 20 46 41 4c 53 45 20 65 76 65 6e 20 69 66  rn FALSE even if
11e70 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
11e80 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
11e90 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
11ea0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
11eb0 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
11ec0 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
11ed0 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
11ee0 75 72 6e 20 46 41 4c 53 45 20 6a 75 73 74 20 74  urn FALSE just t
11ef0 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69  o be safe.  So i
11f00 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
11f10 2a 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2c  * returns false,
11f20 20 74 68 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74   then you do not
11f30 20 72 65 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72   really know for
11f40 20 63 65 72 74 61 69 6e 20 69 66 20 74 68 65 20   certain if the 
11f50 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  two.** expressio
11f60 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
11f70 20 20 42 75 74 20 69 66 20 79 6f 75 20 67 65 74    But if you get
11f80 20 61 20 54 52 55 45 20 72 65 74 75 72 6e 2c 20   a TRUE return, 
11f90 74 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20  then you.** can 
11fa0 62 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72  be sure the expr
11fb0 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20  essions are the 
11fc0 73 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c  same.  In the pl
11fd0 61 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68  aces where.** th
11fe0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
11ff0 65 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ed, it does not 
12000 68 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65  hurt to get an e
12010 78 74 72 61 20 46 41 4c 53 45 20 2d 20 74 68 61  xtra FALSE - tha
12020 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68 74 20  t.** just might 
12030 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65 20 73  result in some s
12040 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 20 63  lightly slower c
12050 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e  ode.  But return
12060 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f 72 72  ing.** an incorr
12070 65 63 74 20 54 52 55 45 20 63 6f 75 6c 64 20 6c  ect TRUE could l
12080 65 61 64 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63  ead to a malfunc
12090 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
120a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
120b0 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
120c0 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
120d0 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30  if( pA==0||pB==0
120e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
120f0 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28  B==pA;.  }.  if(
12100 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
12110 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12120 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
12130 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
12140 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
12150 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
12160 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
12170 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
12180 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
12190 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
121a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
121b0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
121c0 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
121d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
121e0 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
121f0 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
12200 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
12210 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
12220 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
12230 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
12240 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
12250 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
12260 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
12270 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
12280 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
12290 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
122a0 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61  pr, pB->pList->a
122b0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
122c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
122d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
122e0 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c  }else if( pB->pL
122f0 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
12300 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
12310 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42  A->pSelect || pB
12320 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ->pSelect ) retu
12330 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
12340 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
12350 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
12360 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
12370 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12380 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55   pA->op!=TK_COLU
12390 4d 4e 20 26 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e  MN && pA->token.
123a0 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  z ){.    if( pB-
123b0 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65  >token.z==0 ) re
123c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
123d0 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d  pB->token.n!=pA-
123e0 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72  >token.n ) retur
123f0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 0;.    if( sql
12400 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
12410 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c  ar*)pA->token.z,
12420 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e  (char*)pB->token
12430 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21  .z,pB->token.n)!
12440 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
12450 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
12460 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a    return 1;.}...
12470 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
12480 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
12490 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
124a0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
124b0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
124c0 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
124d0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
124e0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
124f0 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
12500 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
12510 6e 66 6f 43 6f 6c 75 6d 6e 28 41 67 67 49 6e 66  nfoColumn(AggInf
12520 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
12530 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43 6f   i;.  pInfo->aCo
12540 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  l = sqlite3Array
12550 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
12560 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
12570 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
12580 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
12590 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
125a0 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20  Info->nColumn,. 
125b0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43        &pInfo->nC
125c0 6f 6c 75 6d 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  olumnAlloc,.    
125d0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74     &i.  );.  ret
125e0 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
125f0 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
12600 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
12610 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
12620 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
12630 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
12640 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
12650 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
12660 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
12670 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
12680 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
12690 66 6f 46 75 6e 63 28 41 67 67 49 6e 66 6f 20 2a  foFunc(AggInfo *
126a0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
126b0 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 20  .  pInfo->aFunc 
126c0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
126d0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 20 70  locate(.       p
126e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
126f0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
12700 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
12710 20 20 20 20 33 2c 0a 20 20 20 20 20 20 20 26 70      3,.       &p
12720 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20  Info->nFunc,.   
12730 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
12740 63 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 20 26  cAlloc,.       &
12750 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
12760 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
12770 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63  This is an xFunc
12780 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
12790 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  e() used to impl
127a0 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65  ement .** sqlite
127b0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
127c0 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
127d0 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
127e0 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
127f0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
12800 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
12810 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
12820 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72 65  alyzes the aggre
12830 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74  gate function at
12840 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69   pExpr..*/.stati
12850 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
12860 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72  regate(void *pAr
12870 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
12880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
12890 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28  Context *pNC = (
128a0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70 41  NameContext *)pA
128b0 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rg;.  Parse *pPa
128c0 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
128d0 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
128e0 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
128f0 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
12900 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
12910 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 0a  C->pAggInfo;.  .
12920 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
12930 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
12940 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
12950 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
12960 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 43  MN: {.      /* C
12970 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
12980 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
12990 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
129a0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
129b0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
129c0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
129d0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
129e0 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
129f0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
12a00 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
12a10 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
12a20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
12a30 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
12a40 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
12a50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
12a60 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
12a70 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
12a80 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
12a90 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
12aa0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
12ab0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
12ac0 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
12ad0 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
12ae0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
12af0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
12b00 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
12b10 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
12b20 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
12b30 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
12b40 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
12b50 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
12b60 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
12b70 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
12b80 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
12b90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
12ba0 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
12bb0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
12bc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12bd0 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
12be0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
12bf0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
12c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
12c10 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
12c20 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
12c30 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
12c40 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
12c50 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
12c60 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
12c70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
12c80 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
12c90 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
12cb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
12cc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
12cd0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
12ce0 28 20 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( k>=pAggInfo->n
12cf0 43 6f 6c 75 6d 6e 20 26 26 20 28 6b 20 3d 20 61  Column && (k = a
12d00 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
12d10 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29 7b  pAggInfo))>=0 ){
12d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
12d30 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
12d40 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  >aCol[k];.      
12d50 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
12d60 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
12d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12d80 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pCol->iTable = p
12d90 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
12db0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70  ->iColumn = pExp
12dc0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
12dd0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
12de0 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
12df0 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Mem++;.         
12e00 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
12e10 65 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  erColumn = -1;. 
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
12e30 6c 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  l->pExpr = pExpr
12e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12e50 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  if( pAggInfo->pG
12e60 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
12e70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c            int j,
12e80 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
12e90 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
12ea0 42 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47  B = pAggInfo->pG
12eb0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
12ec0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
12ed0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
12ee0 65 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20  erm = pGB->a;.  
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
12f00 3d 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pGB->nExpr;.  
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
12f20 72 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c  r(j=0; j<n; j++,
12f30 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
12f40 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
12f50 72 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pE = pTerm->p
12f60 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
12f70 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
12f80 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
12f90 20 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78   pE->iTable==pEx
12fa0 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d      pE->iColumn=
12fd0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
12fe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
12ff0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
13000 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  rterColumn = j;.
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
13050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
13060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
13070 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
13080 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
13090 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
130a0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
130b0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72  = pAggInfo->nSor
130c0 74 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20  tingColumn++;.  
130d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
130e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
130f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65          /* There
13100 20 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79   is now an entry
13110 20 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41   for pExpr in pA
13120 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28  ggInfo->aCol[] (
13130 65 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  either.         
13140 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74     ** because it
13150 20 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72   was there befor
13160 65 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20  e or because we 
13170 6a 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29  just created it)
13180 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
13190 20 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78   Convert the pEx
131a0 70 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47  pr to be a TK_AG
131b0 47 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69  G_COLUMN referri
131c0 6e 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20  ng to that.     
131d0 20 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e         ** pAggIn
131e0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79  fo->aCol[] entry
131f0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
13200 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
13210 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
13220 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
13230 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
13240 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
13250 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
13260 72 2d 3e 69 41 67 67 20 3d 20 6b 3b 0a 20 20 20  r->iAgg = k;.   
13270 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13280 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
13290 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
132a0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
132b0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
132c0 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
132d0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
132e0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
132f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
13300 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
13310 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ION: {.      /* 
13320 54 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  The pNC->nDepth=
13330 3d 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61  =0 test causes a
13340 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
13350 6e 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73  ns in subqueries
13360 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  .      ** to be 
13370 69 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20  ignored */.     
13380 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68   if( pNC->nDepth
13390 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
133a0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
133b0 66 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70  f pExpr is a dup
133c0 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
133d0 72 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20  r aggregate .   
133e0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
133f0 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79   that is already
13400 20 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f   in the pAggInfo
13410 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20   structure.     
13420 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74     */.        st
13430 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
13440 63 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49  c *pItem = pAggI
13450 6e 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20  nfo->aFunc;.    
13460 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13470 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
13480 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
13490 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
134a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
134b0 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45  pItem->pExpr, pE
134c0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
134d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
134e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
134f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
13500 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
13510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
13520 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
13530 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
13540 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
13550 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
13560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
13570 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
13580 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
13590 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
135a0 6e 66 6f 46 75 6e 63 28 70 41 67 67 49 6e 66 6f  nfoFunc(pAggInfo
135b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
135c0 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   i>=0 ){.       
135d0 20 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41       pItem = &pA
135e0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
135f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
13600 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
13610 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
13620 70 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50  pItem->iMem = pP
13630 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
13640 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
13650 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >pFunc = sqlite3
13660 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
13670 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
13680 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
13690 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
136a0 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
136b0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
136c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
136d0 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
136e0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
136f0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
13700 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
13710 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
13720 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
13730 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
13740 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
13750 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
13760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13770 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
13780 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
13790 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
137a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
137b0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
137c0 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
137d0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
137e0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
137f0 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
13800 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
13810 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
13820 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
13830 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
13840 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13850 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
13860 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72  .  }..  /* Recur
13870 73 69 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71  sively walk subq
13880 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66  ueries looking f
13890 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  or TK_COLUMN nod
138a0 65 73 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a  es that need.  *
138b0 2a 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20  * to be changed 
138c0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
138d0 2e 20 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74  .  But increment
138e0 20 6e 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a   nDepth so that.
138f0 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43    ** TK_AGG_FUNC
13900 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75  TION nodes in su
13910 62 71 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65  bqueries will be
13920 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
13930 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53  .  if( pExpr->pS
13940 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43  elect ){.    pNC
13950 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20  ->nDepth++;.    
13960 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70  walkSelectExpr(p
13970 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61  Expr->pSelect, a
13980 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c  nalyzeAggregate,
13990 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e   pNC);.    pNC->
139a0 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20  nDepth--;.  }.  
139b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
139c0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67  ** Analyze the g
139d0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
139e0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
139f0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
13a00 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
13a10 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
13a20 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
13a30 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
13a40 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20   array..** Make 
13a50 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  additional entri
13a60 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  es to the pParse
13a70 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
13a80 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
13a90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13aa0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
13ab0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
13ac0 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
13ad0 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
13ae0 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  by sqlite3ExprRe
13af0 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a  solveNames()..**
13b00 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72  .** If errors ar
13b10 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e  e seen, leave an
13b20 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
13b30 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65  n zErrMsg and re
13b40 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
13b50 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
13b60 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
13b70 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
13b80 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
13b90 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
13ba0 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70  {.  int nErr = p
13bb0 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72  NC->pParse->nErr
13bc0 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
13bd0 28 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41  (pExpr, analyzeA
13be0 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a  ggregate, pNC);.
13bf0 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50    return pNC->pP
13c00 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72  arse->nErr - nEr
13c10 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  r;.}../*.** Call
13c20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
13c30 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
13c40 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
13c50 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
13c60 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
13c70 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
13c80 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
13c90 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
13ca0 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
13cb0 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
13cc0 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rt..*/.int sqlit
13cd0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
13ce0 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
13cf0 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
13d00 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
13d10 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
13d20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
13d30 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
13d40 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
13d50 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
13d60 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72  ist->a, i=0; nEr
13d70 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d  r==0 && i<pList-
13d80 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
13d90 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72  em++){.      nEr
13da0 72 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r += sqlite3Expr
13db0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
13dc0 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
13dd0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
13de0 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d    return nErr;.}
13df0 0a                                               .