/ Hex Artifact Content
Login

Artifact 971dd206ec0fa82d9fd1abb587a40df226f98966:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 32 38 32 20 32 30 30 37 2f 30 33 2f 32 36 20  .282 2007/03/26 
0220: 32 32 3a 30 35 3a 30 31 20 64 72 68 20 45 78 70  22:05:01 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a 20  ( op==TK_AS ){. 
04d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
04e0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
04f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d  xpr->pLeft);.  }
0500: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0510: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
0520: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
0530: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53  finity(pExpr->pS
0540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
0550: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [0].pExpr);.  }.
0560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0570: 4d 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f  MIT_CAST.  if( o
0580: 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20  p==TK_CAST ){.  
0590: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
05a0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
05b0: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d  xpr->token);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
05d0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
05e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
05f0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
0600: 75 65 6e 63 65 20 66 6f 72 20 65 78 70 72 65 73  uence for expres
0610: 73 69 6f 6e 20 70 45 78 70 72 20 74 6f 20 62 65  sion pExpr to be
0620: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
0630: 2a 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64  * sequence named
0640: 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20 20 52 65   by pToken.   Re
0650: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
0660: 6f 20 74 68 65 20 72 65 76 69 73 65 64 20 65 78  o the revised ex
0670: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 68 65  pression..** The
0680: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0690: 6e 63 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  nce is marked as
06a0: 20 22 65 78 70 6c 69 63 69 74 22 20 75 73 69 6e   "explicit" usin
06b0: 67 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c  g the EP_ExpColl
06c0: 61 74 65 0a 2a 2a 20 66 6c 61 67 2e 20 20 41 6e  ate.** flag.  An
06d0: 20 65 78 70 6c 69 63 69 74 20 63 6f 6c 6c 61 74   explicit collat
06e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 77 69 6c  ing sequence wil
06f0: 6c 20 6f 76 65 72 72 69 64 65 20 69 6d 70 6c 69  l override impli
0700: 63 69 74 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  cit.** collating
0710: 20 73 65 71 75 65 6e 63 65 73 2e 0a 2a 2f 0a 45   sequences..*/.E
0720: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
0730: 53 65 74 43 6f 6c 6c 28 50 61 72 73 65 20 2a 70  SetColl(Parse *p
0740: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0750: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
0760: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
0770: 6f 6c 6c 3b 0a 20 20 69 66 28 20 70 45 78 70 72  oll;.  if( pExpr
0780: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
0790: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
07a0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
07b0: 50 61 72 73 65 2c 20 28 63 68 61 72 2a 29 70 4e  Parse, (char*)pN
07c0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
07d0: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  );.  if( pColl )
07e0: 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f  {.    pExpr->pCo
07f0: 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
0800: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pExpr->flags |= 
0810: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
0820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
0830: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
0840: 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  rn the default c
0850: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0860: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0870: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0880: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
0890: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
08a0: 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a  type, return 0..
08b0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
08c0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50  te3ExprCollSeq(P
08d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
08e0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f  pr *pExpr){.  Co
08f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
0900: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b  ;.  if( pExpr ){
0910: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78  .    pColl = pEx
0920: 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  pr->pColl;.    i
0930: 66 28 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  f( (pExpr->op==T
0940: 4b 5f 41 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_AS || pExpr->o
0950: 70 3d 3d 54 4b 5f 43 41 53 54 29 20 26 26 20 21  p==TK_CAST) && !
0960: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
0970: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0980: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
0990: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
09a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
09b0: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
09c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
09d0: 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c  l) ){ .    pColl
09e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
09f0: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn pColl;.}../*.
0a00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f  ** pExpr is an o
0a10: 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70  perand of a comp
0a20: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0a30: 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a    aff2 is the.**
0a40: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
0a50: 66 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72  f the other oper
0a60: 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
0a70: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
0a80: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0a90: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
0aa0: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
0ab0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0ac0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0ad0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
0ae0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
0af0: 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20  r aff2){.  char 
0b00: 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78  aff1 = sqlite3Ex
0b10: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0b20: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26  );.  if( aff1 &&
0b30: 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20   aff2 ){.    /* 
0b40: 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  Both sides of th
0b50: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65  e comparison are
0b60: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65   columns. If one
0b70: 20 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20   has numeric.   
0b80: 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73   ** affinity, us
0b90: 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73  e that. Otherwis
0ba0: 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74  e use no affinit
0bb0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
0bc0: 28 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72  ( sqlite3IsNumer
0bd0: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29  icAffinity(aff1)
0be0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d   || sqlite3IsNum
0bf0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66  ericAffinity(aff
0c00: 32 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  2) ){.      retu
0c10: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
0c20: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  MERIC;.    }else
0c30: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
0c40: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
0c50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
0c60: 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32  ( !aff1 && !aff2
0c70: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68   ){.    /* Neith
0c80: 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  er side of the c
0c90: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
0ca0: 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20  olumn.  Compare 
0cb0: 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
0cc0: 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20  ts directly..   
0cd0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
0ce0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
0cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
0d00: 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f  One side is a co
0d10: 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20  lumn, the other 
0d20: 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20  is not. Use the 
0d30: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
0d40: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
0d50: 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32   aff1==0 || aff2
0d60: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
0d70: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
0d80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
0d90: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0da0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
0db0: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
0dc0: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0dd0: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
0de0: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
0df0: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
0e00: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
0e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
0e20: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
0e30: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
0e40: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
0e50: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0e60: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
0e70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
0e80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
0e90: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0ea0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
0eb0: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0ec0: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
0ed0: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
0ee0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0ef0: 4b 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_NE );.  assert
0f00: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
0f10: 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65  ;.  aff = sqlite
0f20: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
0f30: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
0f40: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
0f50: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
0f60: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0f70: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67  nity(pExpr->pRig
0f80: 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20  ht, aff);.  }.  
0f90: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
0fa0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61  pSelect ){.    a
0fb0: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0fc0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0fd0: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
0fe0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
0ff0: 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  aff);.  }.  else
1000: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
1010: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1020: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 72 65  F_NONE;.  }.  re
1030: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1040: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1050: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1060: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1070: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1080: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1090: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
10a0: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
10b0: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
10c0: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
10d0: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
10e0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
10f0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1100: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
1110: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1120: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1130: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1140: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1150: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1160: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1170: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1180: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1190: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
11a0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  se SQLITE_AFF_NO
11b0: 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  NE:.      return
11c0: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
11d0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
11e0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
11f0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
1200: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
1210: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1220: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1230: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1240: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1250: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1260: 74 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61  the P1 value tha
1270: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1280: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1290: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
12a0: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
12b0: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
12c0: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
12d0: 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20  d pExpr2..** If 
12e0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72  jumpIfNull is tr
12f0: 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  ue, then set the
1300: 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65   low byte of the
1310: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20   returned.** P1 
1320: 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68  value to tell th
1330: 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70  e opcode to jump
1340: 20 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65   if either expre
1350: 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74  ssion.** evaluat
1360: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  es to NULL..*/.s
1370: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79  tatic int binary
1380: 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a  CompareP1(Expr *
1390: 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45  pExpr1, Expr *pE
13a0: 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66  xpr2, int jumpIf
13b0: 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66  Null){.  char af
13c0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
13d0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
13e0: 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e 74 29  .  return ((int)
13f0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1400: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
1410: 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c  ff))+(jumpIfNull
1420: 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f 2a  ?0x100:0);.}../*
1430: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1440: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1450: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1460: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1470: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1480: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1490: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
14a0: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
14b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
14c0: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
14d0: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
14e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
14f0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
1500: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
1510: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1520: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
1530: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
1540: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1550: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1560: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1570: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1580: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1590: 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  ** type..*/.stat
15a0: 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61  ic CollSeq* bina
15b0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
15c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15d0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
15e0: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f  r *pRight){.  Co
15f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
1600: 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
1610: 0a 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68  .  assert( pRigh
1620: 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66 74  t );.  if( pLeft
1630: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
1640: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 61  Collate ){.    a
1650: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 70 43  ssert( pLeft->pC
1660: 6f 6c 6c 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  oll );.    pColl
1670: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1680: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
1690: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
16a0: 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
16b0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
16c0: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 70  ->pColl );.    p
16d0: 43 6f 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70  Coll = pRight->p
16e0: 43 6f 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Coll;.  }else{. 
16f0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1700: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1710: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
1720: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1730: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1740: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1750: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1760: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1770: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
1780: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1790: 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  de for a compari
17a0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
17b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65  .static int code
17c0: 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65  Compare(.  Parse
17d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
17e0: 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64  The parsing (and
17f0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1800: 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  ) context */.  E
1810: 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  xpr *pLeft,     
1820: 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65   /* The left ope
1830: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
1840: 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54  pRight,     /* T
1850: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1860: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65   */.  int opcode
1870: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
1880: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65  omparison opcode
1890: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
18a0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
18b0: 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a  here if true.  *
18c0: 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
18d0: 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65  ll    /* If true
18e0: 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72  , jump if either
18f0: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
1900: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 31 20   */.){.  int p1 
1910: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
1920: 31 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  1(pLeft, pRight,
1930: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1940: 43 6f 6c 6c 53 65 71 20 2a 70 33 20 3d 20 62 69  CollSeq *p3 = bi
1950: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1960: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
1970: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 72 65 74  , pRight);.  ret
1980: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 4f  urn sqlite3VdbeO
1990: 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
19a0: 2c 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 64 65  , opcode, p1, de
19b0: 73 74 2c 20 28 76 6f 69 64 2a 29 70 33 2c 20 50  st, (void*)p3, P
19c0: 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 7d 0a 0a 2f  3_COLLSEQ);.}../
19d0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
19e0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
19f0: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1a00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1a10: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1a20: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1a30: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1a40: 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  eMalloc().  The 
1a50: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1a60: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
1a70: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
1a80: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
1a90: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
1aa0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
1ab0: 74 65 33 45 78 70 72 28 69 6e 74 20 6f 70 2c 20  te3Expr(int op, 
1ac0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1ad0: 72 20 2a 70 52 69 67 68 74 2c 20 63 6f 6e 73 74  r *pRight, const
1ae0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1af0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
1b00: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1b10: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
1b20: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
1b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68  ==0 ){.    /* Wh
1b40: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c  en malloc fails,
1b50: 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61 6e   delete pLeft an
1b60: 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65 73  d pRight. Expres
1b70: 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f 20  sions passed to 
1b80: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
1b90: 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61 79  ction must alway
1ba0: 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 77  s be allocated w
1bb0: 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72 28  ith sqlite3Expr(
1bc0: 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20 20  ) for this .    
1bd0: 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20 20  ** reason. .    
1be0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
1bf0: 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b  prDelete(pLeft);
1c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c10: 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a  Delete(pRight);.
1c20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c30: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f  }.  pNew->op = o
1c40: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  p;.  pNew->pLeft
1c50: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77   = pLeft;.  pNew
1c60: 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67 68  ->pRight = pRigh
1c70: 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67 20  t;.  pNew->iAgg 
1c80: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f 6b  = -1;.  if( pTok
1c90: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
1ca0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
1cb0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70   );.    pNew->sp
1cc0: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
1cd0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
1ce0: 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 29 7b  lse if( pLeft ){
1cf0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
1d00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d10: 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26  ExprSpan(pNew, &
1d20: 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52  pLeft->span, &pR
1d30: 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  ight->span);.   
1d40: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66     if( pRight->f
1d50: 6c 61 67 73 20 26 26 20 45 50 5f 45 78 70 43 6f  lags && EP_ExpCo
1d60: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
1d70: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1d80: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1d90: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f         pNew->pCo
1da0: 6c 6c 20 3d 20 70 52 69 67 68 74 2d 3e 70 43 6f  ll = pRight->pCo
1db0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1dc0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  }.    if( pLeft-
1dd0: 3e 66 6c 61 67 73 20 26 26 20 45 50 5f 45 78 70  >flags && EP_Exp
1de0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
1df0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1e00: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
1e10: 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
1e20: 20 3d 20 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b   = pLeft->pColl;
1e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e40: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1e50: 2a 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 71  ** Works like sq
1e60: 6c 69 74 65 33 45 78 70 72 28 29 20 62 75 74 20  lite3Expr() but 
1e70: 66 72 65 65 73 20 69 74 73 20 70 4c 65 66 74 20  frees its pLeft 
1e80: 61 6e 64 20 70 52 69 67 68 74 20 61 72 67 75 6d  and pRight argum
1e90: 65 6e 74 73 0a 2a 2a 20 69 66 20 69 74 20 66 61  ents.** if it fa
1ea0: 69 6c 73 20 64 75 65 20 74 6f 20 61 20 6d 61 6c  ils due to a mal
1eb0: 6c 6f 63 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  loc problem..*/.
1ec0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
1ed0: 72 4f 72 46 72 65 65 28 69 6e 74 20 6f 70 2c 20  rOrFree(int op, 
1ee0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1ef0: 72 20 2a 70 52 69 67 68 74 2c 20 63 6f 6e 73 74  r *pRight, const
1f00: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1f10: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20  .  Expr *pNew = 
1f20: 73 71 6c 69 74 65 33 45 78 70 72 28 6f 70 2c 20  sqlite3Expr(op, 
1f30: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 70  pLeft, pRight, p
1f40: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4e  Token);.  if( pN
1f50: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
1f60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
1f70: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
1f80: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 52 69  e3ExprDelete(pRi
1f90: 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ght);.  }.  retu
1fa0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
1fb0: 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e  * When doing a n
1fc0: 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f 75  ested parse, you
1fd0: 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65 72   can include ter
1fe0: 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ms in an express
1ff0: 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b  ion.** that look
2000: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23 30   like this:   #0
2010: 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65 73   #1 #2 ...  Thes
2020: 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74 6f  e terms refer to
2030: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20   elements.** on 
2040: 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30 22  the stack.  "#0"
2050: 20 6d 65 61 6e 73 20 74 68 65 20 74 6f 70 20 6f   means the top o
2060: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20  f the stack..** 
2070: 22 23 31 22 20 6d 65 61 6e 73 20 74 68 65 20 6e  "#1" means the n
2080: 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20  ext down on the 
2090: 73 74 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66  stack.  And so f
20a0: 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  orth..**.** This
20b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
20c0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
20d0: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f 6e   to deal with on
20e0: 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 2e   of those terms.
20f0: 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74 65  .** It immediate
2100: 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ly generates cod
2110: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76  e to store the v
2120: 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79  alue in a memory
2130: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68   location..** Th
2140: 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78 70  e returns an exp
2150: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69 6c  ression that wil
2160: 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  l code to extrac
2170: 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  t the value from
2180: 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  .** that memory 
2190: 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65 64  location as need
21a0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
21b0: 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72  ite3RegisterExpr
21c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21d0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
21e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
21f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70  se->pVdbe;.  Exp
2200: 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70 74  r *p;.  int dept
2210: 68 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  h;.  if( pParse-
2220: 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
2230: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2240: 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20  g(pParse, "near 
2250: 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65  \"%T\": syntax e
2260: 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  rror", pToken);.
2270: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2280: 7d 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  }.  if( v==0 ) r
2290: 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 73  eturn 0;.  p = s
22a0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52 45  qlite3Expr(TK_RE
22b0: 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70 54  GISTER, 0, 0, pT
22c0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d  oken);.  if( p==
22d0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
22e0: 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  0;  /* Malloc fa
22f0: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64 65  iled */.  }.  de
2300: 70 74 68 20 3d 20 61 74 6f 69 28 28 63 68 61 72  pth = atoi((char
2310: 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29  *)&pToken->z[1])
2320: 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20  ;.  p->iTable = 
2330: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
2340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2350: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64 65  Op(v, OP_Dup, de
2360: 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  pth, 0);.  sqlit
2370: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2380: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e 69  P_MemStore, p->i
2390: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65 74  Table, 1);.  ret
23a0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
23b0: 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73  Join two express
23c0: 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e  ions using an AN
23d0: 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  D operator.  If 
23e0: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
23f0: 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68  n is.** NULL, th
2400: 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  en just return t
2410: 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  he other express
2420: 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ion..*/.Expr *sq
2430: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78 70  lite3ExprAnd(Exp
2440: 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a  r *pLeft, Expr *
2450: 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  pRight){.  if( p
2460: 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Left==0 ){.    r
2470: 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20  eturn pRight;.  
2480: 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74  }else if( pRight
2490: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
24a0: 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65  n pLeft;.  }else
24b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
24c0: 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c  ite3Expr(TK_AND,
24d0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
24e0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
24f0: 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70   Set the Expr.sp
2500: 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  an field of the 
2510: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
2520: 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20   to span all.** 
2530: 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65  text between the
2540: 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e   two given token
2550: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2560: 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72 20  e3ExprSpan(Expr 
2570: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
2580: 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69  Left, Token *pRi
2590: 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ght){.  assert( 
25a0: 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61  pRight!=0 );.  a
25b0: 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20  ssert( pLeft!=0 
25c0: 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  );.  if( !sqlite
25d0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
25e0: 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26 20  && pRight->z && 
25f0: 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20  pLeft->z ){.    
2600: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 64  assert( pLeft->d
2610: 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e  yn==0 || pLeft->
2620: 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29  z[pLeft->n]==0 )
2630: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  ;.    if( pLeft-
2640: 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67 68  >dyn==0 && pRigh
2650: 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20  t->dyn==0 ){.   
2660: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
2670: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
2680: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e     pExpr->span.n
2690: 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28   = pRight->n + (
26a0: 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66  pRight->z - pLef
26b0: 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t->z);.    }else
26c0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  {.      pExpr->s
26d0: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d  pan.z = 0;.    }
26e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
26f0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
2700: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
2710: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
2720: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
2730: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
2740: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
2750: 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a  ction(ExprList *
2760: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
2770: 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  oken){.  Expr *p
2780: 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 70  New;.  assert( p
2790: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
27a0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
27b0: 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a  sizeof(Expr) );.
27c0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
27d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
27f0: 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  ); /* Avoid leak
2800: 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20  ing memory when 
2810: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2820: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2830: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  }.  pNew->op = T
2840: 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e  K_FUNCTION;.  pN
2850: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
2860: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  t;.  assert( pTo
2870: 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20  ken->dyn==0 );. 
2880: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
2890: 70 54 6f 6b 65 6e 3b 0a 20 20 70 4e 65 77 2d 3e  pToken;.  pNew->
28a0: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
28b0: 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  en;.  return pNe
28c0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
28d0: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
28e0: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
28f0: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
2900: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
2910: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
2920: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
2930: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
2940: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
2950: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
2960: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
2970: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
2980: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2990: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
29a0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
29b0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
29c0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
29d0: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
29e0: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
29f0: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
2a00: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
2a10: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
2a20: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
2a30: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
2a40: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
2a50: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
2a60: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2a70: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2a80: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
2a90: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
2aa0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
2ab0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
2ac0: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
2ad0: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
2ae0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2af0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
2b00: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
2b10: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
2b20: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
2b30: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
2b40: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
2b50: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
2b60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2b70: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b  r *pExpr){.  Tok
2b80: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69 66  en *pToken;.  if
2b90: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
2ba0: 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20  urn;.  pToken = 
2bb0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pExpr->token;. 
2bc0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2bd0: 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  >n>=1 );.  asser
2be0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
2bf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  );.  assert( pTo
2c00: 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ken->z[0]!=0 );.
2c10: 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d    if( pToken->n=
2c20: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =1 ){.    /* Wil
2c30: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2c40: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
2c50: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
2c60: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70   number */.    p
2c70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b  Expr->iTable = +
2c80: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20  +pParse->nVar;. 
2c90: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65   }else if( pToke
2ca0: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  n->z[0]=='?' ){.
2cb0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
2cc0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
2cd0: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
2ce0: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
2cf0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20   and.    ** use 
2d00: 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62  it as the variab
2d10: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
2d20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70   int i;.    pExp
2d30: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20  r->iTable = i = 
2d40: 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f  atoi((char*)&pTo
2d50: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20  ken->z[1]);.    
2d60: 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c  if( i<1 || i>SQL
2d70: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
2d80: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20  _NUMBER ){.     
2d90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2da0: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
2db0: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
2dc0: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
2dd0: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
2de0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
2df0: 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20  ABLE_NUMBER);.  
2e00: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50    }.    if( i>pP
2e10: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
2e20: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2e30: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = i;.    }.  }e
2e40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  lse{.    /* Wild
2e50: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2e60: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2e70: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
2e80: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
2e90: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
2ea0: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
2eb0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
2ec0: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
2ed0: 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ame.    ** has n
2ee0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
2ef0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
2f00: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
2f10: 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mber.    */.    
2f20: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20  int i, n;.    n 
2f30: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20  = pToken->n;.   
2f40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
2f50: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b  se->nVarExpr; i+
2f60: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
2f70: 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  pE;.      if( (p
2f80: 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61  E = pParse->apVa
2f90: 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20  rExpr[i])!=0.   
2fa0: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f         && pE->to
2fb0: 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20  ken.n==n.       
2fc0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d     && memcmp(pE-
2fd0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e  >token.z, pToken
2fe0: 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ->z, n)==0 ){.  
2ff0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
3000: 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65  ble = pE->iTable
3010: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3020: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3030: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
3040: 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20  ->nVarExpr ){.  
3050: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
3060: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
3070: 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ar;.      if( pP
3080: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d  arse->nVarExpr>=
3090: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
30a0: 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
30b0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
30c0: 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72  xprAlloc += pPar
30d0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
30e0: 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  c + 10;.        
30f0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46  sqliteReallocOrF
3100: 72 65 65 28 26 70 50 61 72 73 65 2d 3e 61 70 56  ree(&pParse->apV
3110: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3130: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
3140: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72  lloc*sizeof(pPar
3150: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d  se->apVarExpr[0]
3160: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
3170: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d     if( !sqlite3M
3180: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
3190: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31a0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
31b0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
31c0: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
31d0: 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  pr[pParse->nVarE
31e0: 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a  xpr++] = pExpr;.
31f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3200: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75  } .}../*.** Recu
3210: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
3220: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
3230: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
3240: 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70  e3ExprDelete(Exp
3250: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
3260: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
3270: 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20  ( p->span.dyn ) 
3280: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
3290: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  *)p->span.z);.  
32a0: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  if( p->token.dyn
32b0: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
32c0: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
32d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
32e0: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
32f0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3300: 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b  lete(p->pRight);
3310: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
3320: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73  stDelete(p->pLis
3330: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
3340: 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65  ectDelete(p->pSe
3350: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
3360: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
3370: 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20   The Expr.token 
3380: 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61  field might be a
3390: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
33a0: 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a  that is quoted..
33b0: 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65  ** If so, remove
33c0: 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d   the quotation m
33d0: 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arks..*/.void sq
33e0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
33f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
3400: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
3410: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
3420: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
3430: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
3440: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
3450: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
3460: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
3470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
3480: 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74 6f 6b 65  kenCopy(&p->toke
3490: 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  n, &p->token);. 
34a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
34b0: 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ote((char*)p->to
34c0: 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ken.z);.}.../*.*
34d0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
34e0: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
34f0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
3500: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
3510: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
3520: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
3530: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
3540: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
3550: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
3560: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
3570: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
3580: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
3590: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
35a0: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
35b0: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
35c0: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
35d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
35e0: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
35f0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
3600: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3610: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
3620: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
3630: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
3640: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
3650: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
3660: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
3670: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
3680: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
3690: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
36a0: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
36b0: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
36c0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
36d0: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
36e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
36f0: 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b  xprDup(Expr *p){
3700: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
3710: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3720: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3730: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3740: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
3750: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3760: 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79  turn 0;.  memcpy
3770: 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66  (pNew, p, sizeof
3780: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
3790: 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b  p->token.z!=0 ){
37a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
37b0: 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  .z = (u8*)sqlite
37c0: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
37d0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f  ->token.z, p->to
37e0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77  ken.n);.    pNew
37f0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b  ->token.dyn = 1;
3800: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
3810: 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65  sert( pNew->toke
3820: 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  n.z==0 );.  }.  
3830: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  pNew->span.z = 0
3840: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
3850: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3860: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e  (p->pLeft);.  pN
3870: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
3880: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
3890: 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Right);.  pNew->
38a0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
38b0: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c  xprListDup(p->pL
38c0: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
38d0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
38e0: 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c  electDup(p->pSel
38f0: 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 54  ect);.  pNew->pT
3900: 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20  ab = p->pTab;.  
3910: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76  return pNew;.}.v
3920: 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e  oid sqlite3Token
3930: 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c  Copy(Token *pTo,
3940: 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a   Token *pFrom){.
3950: 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29    if( pTo->dyn )
3960: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
3970: 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66  r*)pTo->z);.  if
3980: 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20  ( pFrom->z ){.  
3990: 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d    pTo->n = pFrom
39a0: 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  ->n;.    pTo->z 
39b0: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 53 74 72  = (u8*)sqliteStr
39c0: 4e 44 75 70 28 28 63 68 61 72 2a 29 70 46 72 6f  NDup((char*)pFro
39d0: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
39e0: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
39f0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
3a00: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
3a10: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
3a20: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45  te3ExprListDup(E
3a30: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
3a40: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
3a50: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
3a60: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
3a70: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
3a80: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3a90: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3aa0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3ab0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
3ac0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3ad0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3ae0: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
3af0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
3b00: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
3b10: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61  pItem = sqliteMa
3b20: 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73  lloc( p->nExpr*s
3b30: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
3b40: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
3b50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
3b60: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
3b70: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
3b80: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
3b90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3ba0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
3bb0: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
3bc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
3bd0: 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b  Expr, *pOldExpr;
3be0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
3bf0: 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73  r = pNewExpr = s
3c00: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
3c10: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
3c20: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
3c30: 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  f( pOldExpr->spa
3c40: 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78  n.z!=0 && pNewEx
3c50: 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  pr ){.      /* A
3c60: 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70  lways make a cop
3c70: 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f  y of the span fo
3c80: 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72  r top-level expr
3c90: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
3ca0: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
3cb0: 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f  on list.  The lo
3cc0: 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72  gic in SELECT pr
3cd0: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65  ocessing that de
3ce0: 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a  termines.      *
3cf0: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  * the names of c
3d00: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
3d10: 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74  sult set needs t
3d20: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
3d30: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3d40: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45  TokenCopy(&pNewE
3d50: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64  xpr->span, &pOld
3d60: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
3d70: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
3d80: 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e  NewExpr==0 || pN
3d90: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ewExpr->span.z!=
3da0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  0 .            |
3db0: 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  | pOldExpr->span
3dc0: 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  .z==0.          
3dd0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c    || sqlite3Mall
3de0: 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20  ocFailed() );.  
3df0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
3e00: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
3e10: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
3e20: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
3e30: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
3e40: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
3e50: 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70  pItem->isAgg = p
3e60: 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a  OldItem->isAgg;.
3e70: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
3e80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
3e90: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3ea0: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
3eb0: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
3ec0: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
3ed0: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
3ee0: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
3ef0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
3f00: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
3f10: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
3f20: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
3f30: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
3f40: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
3f50: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
3f60: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
3f70: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
3f80: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
3f90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3fa0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
3fb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3fc0: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
3fd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3fe0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
3ff0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
4000: 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74  cListDup(SrcList
4010: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
4020: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
4030: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
4040: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4050: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
4060: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
4070: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
4080: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
4090: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
40a0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
40b0: 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20  cRaw( nByte );. 
40c0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
40d0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
40e0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
40f0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
4100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4110: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
4120: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4130: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
4140: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
4150: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
4160: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
4170: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
4180: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
4190: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
41a0: 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ase = sqliteStrD
41b0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  up(pOldItem->zDa
41c0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
41d0: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
41e0: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
41f0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
4200: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
4210: 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  as = sqliteStrDu
4220: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  p(pOldItem->zAli
4230: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
4240: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
4250: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
4260: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
4270: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
4280: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
4290: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70   pNewItem->isPop
42a0: 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  ulated = pOldIte
42b0: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a  m->isPopulated;.
42c0: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
42d0: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
42e0: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
42f0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
4300: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
4310: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
4320: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
4330: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
4340: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
4350: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
4360: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
4370: 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  prDup(pOldItem->
4380: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
4390: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
43a0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f  ite3IdListDup(pO
43b0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
43c0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
43d0: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
43e0: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
43f0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
4400: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
4410: 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74  IdListDup(IdList
4420: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
4430: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
4440: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4450: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
4460: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
4470: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
4480: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4490: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
44a0: 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e  w->nId = pNew->n
44b0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a  Alloc = p->nId;.
44c0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
44d0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e  teMallocRaw( p->
44e0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
44f0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
4500: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
4510: 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b  qliteFree(pNew);
4520: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4530: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4540: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
4550: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
4560: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
4570: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
4580: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
4590: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
45a0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
45b0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
45c0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
45d0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
45e0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
45f0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
4600: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
4610: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
4620: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4630: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
4640: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
4650: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4660: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
4670: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
4680: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
4690: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
46a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  rn 0;.  pNew->is
46b0: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
46c0: 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77  Distinct;.  pNew
46d0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
46e0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
46f0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  >pEList);.  pNew
4700: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
4710: 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53  SrcListDup(p->pS
4720: 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  rc);.  pNew->pWh
4730: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
4740: 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b  rDup(p->pWhere);
4750: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
4760: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
4770: 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75 70  istDup(p->pGroup
4780: 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  By);.  pNew->pHa
4790: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
47a0: 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e 67  prDup(p->pHaving
47b0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
47c0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
47d0: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72 64  rListDup(p->pOrd
47e0: 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  erBy);.  pNew->o
47f0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65  p = p->op;.  pNe
4800: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69  w->pPrior = sqli
4810: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  te3SelectDup(p->
4820: 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d  pPrior);.  pNew-
4830: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
4840: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69 6d  3ExprDup(p->pLim
4850: 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  it);.  pNew->pOf
4860: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
4870: 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65 74  prDup(p->pOffset
4880: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
4890: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
48a0: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
48b0: 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64  pNew->isResolved
48c0: 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64   = p->isResolved
48d0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20  ;.  pNew->isAgg 
48e0: 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 4e  = p->isAgg;.  pN
48f0: 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 30  ew->usesEphm = 0
4900: 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c 6c  ;.  pNew->disall
4910: 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  owOrderBy = 0;. 
4920: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
4930: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
4940: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
4950: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
4960: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
4970: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
4980: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
4990: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
49a0: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
49b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
49c0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61  (Select *p){.  a
49d0: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
49e0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
49f0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
4a00: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
4a10: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
4a20: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
4a30: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
4a40: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
4a50: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
4a60: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
4a70: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
4a80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
4a90: 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a  ppend(ExprList *
4aa0: 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78  pList, Expr *pEx
4ab0: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
4ac0: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
4ad0: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
4ae0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
4af0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
4b00: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
4b10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
4b20: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
4b30: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
4b40: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
4b50: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
4b60: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
4b70: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
4b80: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4b90: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
4ba0: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
4bb0: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
4bc0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
4bd0: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
4be0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
4bf0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
4c00: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
4c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
4c20: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c  t->a = a;.    pL
4c30: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b  ist->nAlloc = n;
4c40: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4c50: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
4c60: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
4c70: 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  me ){.    struct
4c80: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
4c90: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
4ca0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
4cb0: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
4cc0: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
4cd0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
4ce0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
4cf0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4d00: 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  (pName);.    pIt
4d10: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
4d20: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
4d30: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
4d40: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
4d50: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
4d60: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
4d70: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
4d80: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
4d90: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
4da0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
4db0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
4dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
4dd0: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
4de0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
4df0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
4e00: 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73  stDelete(ExprLis
4e10: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
4e20: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
4e30: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
4e40: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
4e50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
4e60: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
4e70: 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78  0 || (pList->nEx
4e80: 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e  pr==0 && pList->
4e90: 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20  nAlloc==0) );.  
4ea0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
4eb0: 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr<=pList->nAl
4ec0: 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  loc );.  for(pIt
4ed0: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
4ee0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
4ef0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
4f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4f10: 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45  Delete(pItem->pE
4f20: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
4f30: 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Free(pItem->zNam
4f40: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
4f50: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
4f60: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
4f70: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  st);.}../*.** Wa
4f80: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
4f90: 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46 75   tree.  Call xFu
4fa0: 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65  nc for each node
4fb0: 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   visited..**.** 
4fc0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
4fd0: 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74 65   from xFunc dete
4fe0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 74  rmines whether t
4ff0: 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e  he tree walk con
5000: 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61  tinues..** 0 mea
5010: 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b  ns continue walk
5020: 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20 31  ing the tree.  1
5030: 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61   means do not wa
5040: 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f  lk children.** o
5050: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  f the current no
5060: 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  de but continue 
5070: 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20 20  with siblings.  
5080: 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a  2 means abandon.
5090: 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  ** the tree walk
50a0: 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a   completely..**.
50b0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
50c0: 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  lue from this ro
50d0: 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61 62  utine is 1 to ab
50e0: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
50f0: 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20  alk.** and 0 to 
5100: 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
5110: 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72 6f  NOTICE:  This ro
5120: 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74 2a  utine does *not*
5130: 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73 75   descend into su
5140: 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61  bqueries..*/.sta
5150: 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72  tic int walkExpr
5160: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 2c  List(ExprList *,
5170: 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c   int (*)(void *,
5180: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29   Expr*), void *)
5190: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  ;.static int wal
51a0: 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20 2a  kExprTree(Expr *
51b0: 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75  pExpr, int (*xFu
51c0: 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29  nc)(void*,Expr*)
51d0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
51e0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
51f0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
5200: 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75   0;.  rc = (*xFu
5210: 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72 29  nc)(pArg, pExpr)
5220: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5230: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
5240: 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65  rTree(pExpr->pLe
5250: 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ft, xFunc, pArg)
5260: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
5270: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
5280: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  e(pExpr->pRight,
5290: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
52a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
52b0: 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  ( walkExprList(p
52c0: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75  Expr->pList, xFu
52d0: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
52e0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
52f0: 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn rc>1;.}../*.*
5300: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
5310: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
5320: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69  expression in li
5330: 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st p..*/.static 
5340: 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  int walkExprList
5350: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
5360: 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20  t (*xFunc)(void 
5370: 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  *, Expr*), void 
5380: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b  *pArg){.  int i;
5390: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
53a0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
53b0: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
53c0: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  n 0;.  for(i=p->
53d0: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
53e0: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
53f0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 77  em++){.    if( w
5400: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74 65  alkExprTree(pIte
5410: 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c  m->pExpr, xFunc,
5420: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
5430: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
5440: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  0;.}../*.** Call
5450: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
5460: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
5470: 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 70  sion in Select p
5480: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a  , not including.
5490: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
54a0: 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20  hat are part of 
54b0: 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 61  sub-selects in a
54c0: 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ny FROM clause o
54d0: 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f  r the LIMIT.** o
54e0: 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73 73  r OFFSET express
54f0: 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ions...*/.static
5500: 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74 45   int walkSelectE
5510: 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  xpr(Select *p, i
5520: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
5530: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
5540: 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45   *pArg){.  walkE
5550: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
5560: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  t, xFunc, pArg);
5570: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
5580: 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e 63  p->pWhere, xFunc
5590: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
55a0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
55b0: 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  pBy, xFunc, pArg
55c0: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  );.  walkExprTre
55d0: 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46  e(p->pHaving, xF
55e0: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
55f0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  lkExprList(p->pO
5600: 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20 70  rderBy, xFunc, p
5610: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
5620: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
5630: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
5640: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
5650: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
5660: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20  e()..**.** pArg 
5670: 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
5680: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
5690: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74 65  r.  If we can te
56a0: 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  ll by looking.**
56b0: 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20 74   at pExpr that t
56c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
56d0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78 70  at contains pExp
56e0: 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  r is not a const
56f0: 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
5700: 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41 72  n, then set *pAr
5710: 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  g to 0 and retur
5720: 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  n 2 to abandon t
5730: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
5740: 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20 64   If pExpr does d
5750: 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c 69  oes not disquali
5760: 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
5770: 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20 63  n from being a c
5780: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20  onstant.** then 
5790: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  do nothing..**.*
57a0: 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67 20  * After walking 
57b0: 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c 20  the whole tree, 
57c0: 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20  if no nodes are 
57d0: 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71 75  found that disqu
57e0: 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78 70  alify.** the exp
57f0: 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74  ression as const
5800: 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73 73  ant, then we ass
5810: 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ume the whole ex
5820: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
5830: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73 71  onstant.  See sq
5840: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
5850: 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  ant() for additi
5860: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5880: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
5890: 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  nt(void *pArg, E
58a0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
58b0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
58c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
58d0: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
58e0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
58f0: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
5900: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
5910: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72  .    ** and *pAr
5920: 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65  g==2 */.    case
5930: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
5940: 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74 2a 29      if( *((int*)
5950: 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74 75 72  pArg)==2 ) retur
5960: 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  n 0;.      /* Fa
5970: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
5980: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
5990: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
59a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
59b0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  T:.    case TK_A
59c0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
59d0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
59e0: 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN:.#ifndef SQL
59f0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5a00: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
5a10: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
5a20: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
5a30: 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70  .      *((int*)p
5a40: 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  Arg) = 0;.      
5a50: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63 61  return 2;.    ca
5a60: 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20  se TK_IN:.      
5a70: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
5a80: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  ct ){.        *(
5a90: 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b  (int*)pArg) = 0;
5aa0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5ab0: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64  2;.      }.    d
5ac0: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
5ad0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
5ae0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
5af0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
5b00: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
5b10: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
5b20: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
5b30: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
5b40: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
5b50: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
5b60: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
5b70: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
5b80: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
5b90: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
5ba0: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
5bb0: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
5bc0: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
5bd0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
5be0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
5bf0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
5c00: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
5c10: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
5c20: 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74  ){.  int isConst
5c30: 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 1;.  walkExpr
5c40: 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65  Tree(p, exprNode
5c50: 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43  IsConstant, &isC
5c60: 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  onst);.  return 
5c70: 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  isConst;.}../*.*
5c80: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
5c90: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
5ca0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
5cb0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
5cc0: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
5cd0: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
5ce0: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
5cf0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
5d00: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
5d10: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
5d20: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
5d30: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
5d40: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
5d50: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
5d60: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
5d70: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
5d80: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
5d90: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
5da0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
5db0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
5dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
5dd0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
5de0: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
5df0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
5e00: 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   2;.  walkExprTr
5e10: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
5e20: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
5e30: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
5e40: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
5e50: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
5e60: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
5e70: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
5e80: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
5e90: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
5ea0: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
5eb0: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
5ec0: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
5ed0: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
5ee0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
5ef0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5f00: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
5f10: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
5f20: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
5f30: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
5f40: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
5f50: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
5f60: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
5f70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5f80: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
5f90: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
5fa0: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
5fb0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
5fc0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
5fd0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5fe0: 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29  GetInt32((char*)
5ff0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
6000: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
6010: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
6020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6030: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6040: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
6050: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
6060: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
6070: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
6080: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6090: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
60a0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
60b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
60c0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
60d0: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
60e0: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
60f0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6100: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6110: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
6120: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
6130: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
6140: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
6150: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
6160: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
6170: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
6180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
6190: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
61a0: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
61b0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
61c0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
61d0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
61e0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
61f0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
6200: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
6210: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
6220: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
6230: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
6240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
6250: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
6260: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
6270: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
6280: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
6290: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
62a0: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
62b0: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
62c0: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
62d0: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
62e0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
62f0: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
6300: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
6310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
6320: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
6330: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
6340: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
6350: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
6360: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
6370: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
6380: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
63b0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
63c0: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
63d0: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
63e0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
63f0: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
6400: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
6410: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
6420: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
6430: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
6440: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
6450: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
6460: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
6470: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
6480: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
6490: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
64a0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
64b0: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
64c0: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
64d0: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
64e0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
64f0: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
6500: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
6510: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
6520: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
6530: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
6540: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
6550: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
6560: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
6570: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
6580: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
6590: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
65a0: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
65b0: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
65c0: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
65d0: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
65e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
65f0: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
6600: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
6610: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
6620: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
6630: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
6640: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
6650: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
6660: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
6670: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
6680: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
6690: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
66a0: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
66b0: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
66c0: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
66d0: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
66e0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
66f0: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
6700: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
6710: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
6720: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
6730: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
6740: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
6750: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6760: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
6770: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
6780: 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20  en *pDbToken,   
6790: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
67a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
67b0: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
67c0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
67d0: 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a  pTableToken,  /*
67e0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
67f0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
6800: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
6810: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b  oken *pColumnTok
6820: 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  en, /* Name of t
6830: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
6840: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
6850: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
6860: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
6870: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
6880: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
6890: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
68a0: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
68b0: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
68c0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
68d0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
68e0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  b = 0;       /* 
68f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
6900: 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69  base.  The "X" i
6910: 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61  n X.Y.Z */.  cha
6920: 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
6930: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
6940: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22   table.  The "Y"
6950: 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a   in X.Y.Z or Y.Z
6960: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
6970: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
6980: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
6990: 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20  .  The "Z" */.  
69a0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
69b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
69c0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
69d0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
69e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
69f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
6a00: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
6a10: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
6a20: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
6a30: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
6a40: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
6a50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
6a60: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
6a70: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
6a80: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
6a90: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
6aa0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
6ab0: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
6ac0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
6ad0: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
6ae0: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
6af0: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
6b00: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
6b10: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
6b20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
6b30: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
6b40: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20   the list */..  
6b50: 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54  assert( pColumnT
6b60: 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54  oken && pColumnT
6b70: 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68  oken->z ); /* Th
6b80: 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e  e Z in X.Y.Z can
6b90: 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  not be NULL */. 
6ba0: 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61   zDb = sqlite3Na
6bb0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54  meFromToken(pDbT
6bc0: 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20  oken);.  zTab = 
6bd0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6be0: 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e  oken(pTableToken
6bf0: 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69  );.  zCol = sqli
6c00: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6c10: 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a  (pColumnToken);.
6c20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
6c30: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
6c40: 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61     goto lookupna
6c50: 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70  me_end;.  }..  p
6c60: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d  Expr->iTable = -
6c70: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20  1;.  while( pNC 
6c80: 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  && cnt==0 ){.   
6c90: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6ca0: 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
6cb0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
6cc0: 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69  pSrcList;..    i
6cd0: 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
6ce0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49       for(i=0, pI
6cf0: 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b  tem=pSrcList->a;
6d00: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
6d10: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
6d20: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
6d30: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  *pTab;.        i
6d40: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
6d50: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
6d60: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
6d70: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
6d80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
6d90: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b!=0 );.        
6da0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
6db0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
6dc0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
6dd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6de0: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
6df0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20         if( zTab 
6e00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6e10: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
6e20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
6e30: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
6e40: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
6e50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
6e60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
6e70: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
6e80: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6e90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6ea0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
6eb0: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
6ec0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
6ed0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
6ee0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
6ef0: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
6f00: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
6f10: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6f20: 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71  if( zDb!=0 && sq
6f30: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
6f40: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
6f50: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
6f60: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6f70: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6f80: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
6f90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6fa0: 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b  if( 0==(cntTab++
6fb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
6fc0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
6fd0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
6fe0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6ff0: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
7000: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
7010: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
7020: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
7030: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43       for(j=0, pC
7040: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
7050: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
7060: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
7070: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7080: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
7090: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
70a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
70b0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
70c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
70d0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
70e0: 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
70f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ;.            cn
7100: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
7110: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
7120: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
7130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61  .            pMa
7140: 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20  tch = pItem;.   
7150: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7160: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
7170: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
7180: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
7190: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
71a0: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
71b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
71c0: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
71d0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
71e0: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
71f0: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
7200: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7210: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
7220: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
7230: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
7240: 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
7250: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
7260: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
7270: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
7280: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
7290: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
72a0: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20  (db), zColl,-1, 
72b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
72c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
72d0: 28 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ( i<pSrcList->nS
72e0: 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc-1 ){.        
72f0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 5b        if( pItem[
7300: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  1].jointype & JT
7310: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7330: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
7340: 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66  urred in the lef
7350: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74  t table of a nat
7360: 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20  ural join,.     
7370: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
7380: 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67 68  en skip the righ
7390: 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64  t table to avoid
73a0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74   a duplicate mat
73b0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
73c0: 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20        pItem++;. 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
73e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
73f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55 73    }else if( (pUs
7400: 69 6e 67 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70  ing = pItem[1].p
7410: 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20  Using)!=0 ){.   
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7430: 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63  If this match oc
7440: 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  curs on a column
7450: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
7460: 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 20  USING clause.   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
7480: 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20  of a join, skip 
7490: 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74 68  the search of th
74a0: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
74b0: 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20   the join.      
74c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
74d0: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
74e0: 65 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a  e match there. *
74f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
7500: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
7510: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
7520: 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b  ; k<pUsing->nId;
7530: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
7540: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
7550: 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73 69  ite3StrICmp(pUsi
7560: 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20  ng->a[k].zName, 
7570: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b               i++
75b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
75c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
75e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
75f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
7600: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
7610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
7620: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
7630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7640: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
7650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
7660: 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77  GGER.    /* If w
7670: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
7680: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20  dy resolved the 
7690: 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65  name, then maybe
76a0: 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61   .    ** it is a
76b0: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
76c0: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
76d0: 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a   reference.    *
76e0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  /.    if( zDb==0
76f0: 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63   && zTab!=0 && c
7700: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  nt==0 && pParse-
7710: 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b  >trigStack!=0 ){
7720: 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74  .      TriggerSt
7730: 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61  ack *pTriggerSta
7740: 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69  ck = pParse->tri
7750: 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61  gStack;.      Ta
7760: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
7770: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
7780: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
7790: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
77a0: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
77b0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
77c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
77d0: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
77e0: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
77f0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
7800: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
7810: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
7820: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
7830: 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pTab;.      }els
7840: 65 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74  e if( pTriggerSt
7850: 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d  ack->oldIdx != -
7860: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
7870: 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29  Cmp("old", zTab)
7880: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
7890: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
78a0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
78b0: 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  dIdx;.        as
78c0: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
78d0: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
78e0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
78f0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
7900: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7910: 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20  if( pTab ){ .   
7920: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
7930: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
7940: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
7950: 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ;..        pExpr
7960: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62  ->pSchema = pTab
7970: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
7980: 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20     cntTab++;.   
7990: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
79a0: 20 69 43 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43   iCol < pTab->nC
79b0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c  ol; iCol++, pCol
79c0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
79d0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
79e0: 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
79f0: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
7a00: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
7a10: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62  ar *zColl = pTab
7a20: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f  ->aCol[iCol].zCo
7a30: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
7a40: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
7a50: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7a60: 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  n = iCol==pTab->
7a70: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43 6f  iPKey ? -1 : iCo
7a80: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
7a90: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
7aa0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7ab0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
7ac0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78          if( (pEx
7ad0: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pr->flags & EP_E
7ae0: 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b  xpCollate)==0 ){
7af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7b00: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
7b10: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
7b20: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
7b30: 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20  oll,-1, 0);.    
7b40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7b50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
7b60: 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
7b70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7b90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
7ba0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
7bb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7bc0: 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20  TRIGGER) */..   
7bd0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61   /*.    ** Perha
7be0: 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61  ps the name is a
7bf0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
7c00: 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20  e ROWID.    */. 
7c10: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
7c20: 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71   cntTab==1 && sq
7c30: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
7c40: 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20  l) ){.      cnt 
7c50: 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72  = 1;.      pExpr
7c60: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ->iColumn = -1;.
7c70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
7c80: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
7c90: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
7ca0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
7cb0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
7cc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28   of the form Z (
7cd0: 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a  not Y.Z or X.Y.Z
7ce0: 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20  ) then the name 
7cf0: 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72  Z.    ** might r
7d00: 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c  efer to an resul
7d10: 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68  t-set alias.  Th
7d20: 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
7d30: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20  example, when.  
7d40: 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f    ** we are reso
7d50: 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74  lving names in t
7d60: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
7d70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7d80: 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a   command:.    **
7d90: 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
7da0: 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d  CT a+b AS x FROM
7db0: 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31   table WHERE x<1
7dc0: 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0;.    **.    **
7dd0: 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74   In cases like t
7de0: 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78  his, replace pEx
7df0: 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  pr with a copy o
7e00: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7e10: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72   that.    ** for
7e20: 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ms the result se
7e30: 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69  t entry ("a+b" i
7e40: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61  n the example) a
7e50: 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
7e60: 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f  ately..    ** No
7e70: 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  te that the expr
7e80: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
7e90: 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20  sult set should 
7ea0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
7eb0: 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65  n.    ** resolve
7ec0: 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  d by the time th
7ed0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
7ee0: 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20  s resolved..    
7ef0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
7f00: 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d 20 70  0 && (pEList = p
7f10: 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30 20 26  NC->pEList)!=0 &
7f20: 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  & zTab==0 ){.   
7f30: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45     for(j=0; j<pE
7f40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
7f50: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
7f60: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
7f70: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
7f80: 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26     if( zAs!=0 &&
7f90: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7fa0: 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  zAs, zCol)==0 ){
7fb0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
7fc0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
7fd0: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
7fe0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
7ff0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
8000: 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20 20 20 20  TK_AS;.         
8010: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
8020: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = j;.          p
8030: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
8040: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c  lite3ExprDup(pEL
8050: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
8060: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 20  ;.          cnt 
8070: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 1;.          a
8080: 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26  ssert( zTab==0 &
8090: 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  & zDb==0 );.    
80a0: 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75        goto looku
80b0: 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20 20 20  pname_end_2;.   
80c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a       }.      } .
80d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
80e0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
80f0: 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  t name context. 
8100: 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65   The loop will e
8110: 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a  xit when either.
8120: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61      ** we have a
8130: 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f   match (cnt>0) o
8140: 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75  r when we run ou
8150: 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78  t of name contex
8160: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
8170: 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  f( cnt==0 ){.   
8180: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
8190: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
81a0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61    /*.  ** If X a
81b0: 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69  nd Y are NULL (i
81c0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
81d0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
81e0: 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20   name Z is.  ** 
81f0: 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68  supplied) and th
8200: 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20  e value of Z is 
8210: 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62  enclosed in doub
8220: 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a  le-quotes, then.
8230: 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69    ** Z is a stri
8240: 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74  ng literal if it
8250: 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61   doesn't match a
8260: 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  ny column names.
8270: 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63    In that.  ** c
8280: 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
8290: 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
82a0: 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61  y and not make a
82b0: 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20  ny changes to.  
82c0: 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20  ** pExpr..  **. 
82d0: 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72   ** Because no r
82e0: 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64  eference was mad
82f0: 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65  e to outer conte
8300: 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52  xts, the pNC->nR
8310: 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61  ef.  ** fields a
8320: 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69  re not changed i
8330: 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20  n any context.. 
8340: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
8350: 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70   && zTab==0 && p
8360: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30  ColumnToken->z[0
8370: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71  ]=='"' ){.    sq
8380: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a  liteFree(zCol);.
8390: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
83a0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74  }..  /*.  ** cnt
83b0: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ==0 means there 
83c0: 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20  was not match.  
83d0: 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72  cnt>1 means ther
83e0: 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20  e were two or.  
83f0: 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e  ** more matches.
8400: 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65    Either way, we
8410: 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a   have an error..
8420: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d    */.  if( cnt!=
8430: 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  1 ){.    char *z
8440: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
8450: 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d  zErr;.    zErr =
8460: 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75   cnt==0 ? "no su
8470: 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a  ch column: %s" :
8480: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
8490: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20  mn name: %s";.  
84a0: 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20    if( zDb ){.   
84b0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
84c0: 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22  ing(&z, zDb, "."
84d0: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
84e0: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
84f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62    }else if( zTab
8500: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8510: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
8520: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
8530: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d  (char*)0);.    }
8540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
8550: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 43 6f  sqliteStrDup(zCo
8560: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
8570: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8580: 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a  arse, zErr, z);.
8590: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
85a0: 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e  );.    pTopNC->n
85b0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Err++;.  }..  /*
85c0: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f   If a column fro
85d0: 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72  m a table in pSr
85e0: 63 4c 69 73 74 20 69 73 20 72 65 66 65 72 65 6e  cList is referen
85f0: 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ced, then record
8600: 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20  .  ** this fact 
8610: 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e  in the pSrcList.
8620: 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d  a[].colUsed bitm
8630: 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63  ask.  Column 0 c
8640: 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30  auses.  ** bit 0
8650: 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c   to be set.  Col
8660: 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20 31  umn 1 sets bit 1
8670: 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
8680: 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f    If the.  ** co
8690: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67  lumn number is g
86a0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
86b0: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
86c0: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20  n the bitmask.  
86d0: 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  ** then set the 
86e0: 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f  high-order bit o
86f0: 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20  f the bitmask.. 
8700: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
8710: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
8720: 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20  Match!=0 ){.    
8730: 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69  int n = pExpr->i
8740: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20  Column;.    if( 
8750: 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  n>=sizeof(Bitmas
8760: 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20  k)*8 ){.      n 
8770: 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  = sizeof(Bitmask
8780: 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  )*8-1;.    }.   
8790: 20 61 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d   assert( pMatch-
87a0: 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d  >iCursor==pExpr-
87b0: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70  >iTable );.    p
87c0: 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c  Match->colUsed |
87d0: 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
87e0: 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61  n;.  }..lookupna
87f0: 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65  me_end:.  /* Cle
8800: 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
8810: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
8820: 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  ee(zDb);.  sqlit
8830: 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73  eFree(zTab);.  s
8840: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8850: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
8860: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
8870: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
8880: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
8890: 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d  Right);.  pExpr-
88a0: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70  >pRight = 0;.  p
88b0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
88c0: 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65  LUMN;.lookupname
88d0: 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65  _end_2:.  sqlite
88e0: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66  Free(zCol);.  if
88f0: 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( cnt==1 ){.    
8900: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
8910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  ;.    sqlite3Aut
8920: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
8930: 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  xpr, pNC->pSrcLi
8940: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  st);.    if( pMa
8950: 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e  tch && !pMatch->
8960: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
8970: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
8980: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
8990: 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d   }.    /* Increm
89a0: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
89b0: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
89c0: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
89d0: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
89e0: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
89f0: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
8a00: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
8a10: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8a20: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
8a30: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
8a40: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
8a50: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
8a60: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
8a70: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
8a80: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
8a90: 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   0;.  } else {. 
8aa0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
8ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8ac0: 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e  outine is design
8ad0: 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66  ed as an xFunc f
8ae0: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
8af0: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
8b00: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
8b10: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
8b20: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
8b30: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
8b40: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
8b50: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
8b60: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
8b70: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
8b80: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
8b90: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
8ba0: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
8bb0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
8bc0: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
8bd0: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
8be0: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
8bf0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
8c00: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
8c10: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8c20: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
8c30: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
8c40: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
8c50: 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65   int nameResolve
8c60: 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67  rStep(void *pArg
8c70: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
8c80: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
8c90: 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
8ca0: 74 2a 29 70 41 72 67 3b 0a 20 20 50 61 72 73 65  t*)pArg;.  Parse
8cb0: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
8cc0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
8cd0: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
8ce0: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  pNC!=0 );.  pPar
8cf0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
8d00: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
8d10: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
8d20: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
8d30: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78  ) return 1;.  Ex
8d40: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
8d50: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
8d60: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
8d70: 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72  G.  if( pNC->pSr
8d80: 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53  cList && pNC->pS
8d90: 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30  rcList->nAlloc>0
8da0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
8db0: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
8dc0: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69  >pSrcList;.    i
8dd0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
8de0: 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69  0; i<pNC->pSrcLi
8df0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
8e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
8e10: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
8e20: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
8e30: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
8e40: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
8e50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
8e60: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
8e70: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
8e80: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
8e90: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
8ea0: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
8eb0: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
8ec0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
8ed0: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
8ee0: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
8ef0: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
8f00: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
8f10: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
8f20: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
8f30: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
8f40: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
8f50: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
8f60: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
8f70: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
8f80: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8f90: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
8fa0: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
8fb0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
8fc0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
8fd0: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
8fe0: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
8ff0: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
9000: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
9010: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
9020: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
9030: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
9040: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
9050: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
9060: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
9070: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
9080: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
9090: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
90a0: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
90b0: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
90c0: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
90d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
90e0: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
90f0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
9100: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
9110: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
9120: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
9130: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
9140: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
9150: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
9160: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
9170: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
9180: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
9190: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
91a0: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
91b0: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
91c0: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
91d0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
91e0: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
91f0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
9200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
9210: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
9220: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
9230: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
9240: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
9250: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
9260: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
9270: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
9280: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
9290: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
92a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
92b0: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
92c0: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
92d0: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
92e0: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
92f0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
9300: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
9310: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
9320: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
9330: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
9340: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
9350: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
9360: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
9370: 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  >pList;    /* Th
9380: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  e argument list 
9390: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
93a0: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
93b0: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
93c0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
93d0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
93e0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
93f0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
9400: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
9410: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
9420: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
9430: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
9440: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
9450: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
9460: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
9470: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
9480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9490: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
94a0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
94b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
94c0: 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20      int auth;   
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
94f0: 20 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63   to use the func
9500: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
9510: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
9520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9530: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
9540: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
9550: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
9560: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
9570: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
9580: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
9590: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
95a0: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
95b0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
95c0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
95d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
95e0: 74 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  t enc = ENC(pPar
95f0: 73 65 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65  se->db);  /* The
9600: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
9610: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64  ng */..      zId
9620: 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d   = (char*)pExpr-
9630: 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  >token.z;.      
9640: 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  nId = pExpr->tok
9650: 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  en.n;.      pDef
9660: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
9670: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
9680: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20  b, zId, nId, n, 
9690: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
96a0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
96b0: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
96c0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
96d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
96e0: 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20  , nId, -1, enc, 
96f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
9700: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
9710: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
9720: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
9730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9740: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
9750: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
9760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9770: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
9780: 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20  ->xFunc==0;.    
9790: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
97a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
97b0: 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66 28 20  ATION.      if( 
97c0: 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  pDef ){.        
97d0: 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41 75  auth = sqlite3Au
97e0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
97f0: 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c  SQLITE_FUNCTION,
9800: 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c   0, pDef->zName,
9810: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
9820: 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b   auth!=SQLITE_OK
9830: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
9840: 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44  ( auth==SQLITE_D
9850: 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ENY ){.         
9860: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9870: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
9880: 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73  authorized to us
9890: 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c  e function: %s",
98a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65       pDef->zName
98d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
98e0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
98f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9900: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
9910: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _NULL;.         
9920: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9930: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
9940: 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 69 73  dif.      if( is
9950: 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c  _agg && !pNC->al
9960: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
9970: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9980: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
9990: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
99a0: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
99b0: 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20   nId,zId);.     
99c0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
99d0: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
99e0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
99f0: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
9a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9a10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9a20: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  se, "no such fun
9a30: 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49  ction: %.*s", nI
9a40: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
9a50: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
9a60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
9a70: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a  ong_num_args ){.
9a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9a90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
9aa0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
9ab0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
9ac0: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20  ction %.*s()",. 
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c              nId,
9ae0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
9af0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
9b00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
9b10: 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _agg ){.        
9b20: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
9b30: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
9b40: 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67       pNC->hasAgg
9b50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9b60: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
9b70: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
9b80: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
9b90: 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20  0; pNC->nErr==0 
9ba0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
9bb0: 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72        walkExprTr
9bc0: 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  ee(pList->a[i].p
9bd0: 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76  Expr, nameResolv
9be0: 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20  erStep, pNC);.  
9bf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9c00: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
9c10: 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  lowAgg = 1;.    
9c20: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f    /* FIX ME:  Co
9c30: 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66  mpute pExpr->aff
9c40: 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74  inity based on t
9c50: 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75  he expected retu
9c60: 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65  rn.      ** type
9c70: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
9c80: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
9c90: 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a   return is_agg;.
9ca0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
9cb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
9cc0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
9cd0: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
9ce0: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
9cf0: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  f.    case TK_IN
9d00: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
9d10: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
9d20: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66          int nRef
9d30: 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69   = pNC->nRef;.#i
9d40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9d50: 54 5f 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20  T_CHECK.        
9d60: 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b  if( pNC->isCheck
9d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
9d80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9d90: 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73  arse,"subqueries
9da0: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
9db0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
9dc0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ");.        }.#e
9dd0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
9de0: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
9df0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9e00: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
9e10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9e20: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
9e30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
9e40: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
9e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
9e60: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
9e70: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
9e80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9e90: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
9ea0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
9eb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
9ec0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
9ed0: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69  IABLE: {.      i
9ee0: 66 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20  f( pNC->isCheck 
9ef0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9f00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9f10: 65 2c 22 70 61 72 61 6d 65 74 65 72 73 20 70 72  e,"parameters pr
9f20: 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43  ohibited in CHEC
9f30: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b  K constraints");
9f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9f50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9f60: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
9f70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
9f80: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
9f90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
9fa0: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
9fb0: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
9fc0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20  table columns.  
9fd0: 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72  Nodes of the for
9fe0: 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65  m ID.ID or ID re
9ff0: 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a  solve into an.**
a000: 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61   index to the ta
a010: 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ble in the table
a020: 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75   list and a colu
a030: 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20  mn offset.  The 
a040: 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20  .** Expr.opcode 
a050: 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69  for such nodes i
a060: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  s changed to TK_
a070: 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70  COLUMN.  The Exp
a080: 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  r.iTable.** valu
a090: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
a0a0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a0b0: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
a0c0: 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a  e in pTabList.**
a0d0: 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22   plus the "base"
a0e0: 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73   value.  The bas
a0f0: 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74  e value will ult
a100: 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74  imately become t
a110: 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f  he.** VDBE curso
a120: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63  r number for a c
a130: 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
a140: 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20  inting into the 
a150: 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61  referenced.** ta
a160: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
a170: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  Column value is 
a180: 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69  changed to the i
a190: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
a1a0: 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  mn .** of the re
a1b0: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20  ferenced table. 
a1c0: 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   The Expr.iColum
a1d0: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
a1e0: 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44  special.** ROWID
a1f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20   column is -1.  
a200: 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d  Any INTEGER PRIM
a210: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
a220: 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a  s tried as an.**
a230: 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44   alias for ROWID
a240: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73  ..**.** Also res
a250: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
a260: 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68  mes and check th
a270: 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20  e functions for 
a280: 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e  proper.** usage.
a290: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20    Make sure all 
a2a0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
a2b0: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
a2c0: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a  d all functions.
a2d0: 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ** have the corr
a2e0: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ect number of ar
a2f0: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
a300: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a310: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  .** in pParse->z
a320: 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69  ErrMsg if anythi
a330: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
a340: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
a350: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
a360: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
a370: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72  on contains aggr
a380: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
a390: 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f  then set the EP_
a3a0: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
a3b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
a3c0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
a3d0: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
a3e0: 73 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  s(.  NameContext
a3f0: 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pNC,       /* 
a400: 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73  Namespace to res
a410: 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73  olve expressions
a420: 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a   in. */.  Expr *
a430: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
a440: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
a450: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
a460: 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ed. */.){.  int 
a470: 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20 69  savedHasAgg;.  i
a480: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
a490: 74 75 72 6e 20 30 3b 0a 20 20 73 61 76 65 64 48  turn 0;.  savedH
a4a0: 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73  asAgg = pNC->has
a4b0: 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41  Agg;.  pNC->hasA
a4c0: 67 67 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78  gg = 0;.  walkEx
a4d0: 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61  prTree(pExpr, na
a4e0: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
a4f0: 70 4e 43 29 3b 0a 20 20 69 66 28 20 70 4e 43 2d  pNC);.  if( pNC-
a500: 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45  >nErr>0 ){.    E
a510: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
a520: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
a530: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e  .  }.  if( pNC->
a540: 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78  hasAgg ){.    Ex
a550: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
a560: 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20  xpr, EP_Agg);.  
a570: 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65 64 48  }else if( savedH
a580: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43  asAgg ){.    pNC
a590: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
a5a0: 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48  }.  return ExprH
a5b0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
a5c0: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a  , EP_Error);.}..
a5d0: 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  /*.** A pointer 
a5e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
a5f0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73   structure is us
a600: 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72  ed to pass infor
a610: 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67  mation.** throug
a620: 68 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69  h walkExprTree i
a630: 6e 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79  nto codeSubquery
a640: 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  Step()..*/.typed
a650: 65 66 20 73 74 72 75 63 74 20 51 75 65 72 79 43  ef struct QueryC
a660: 6f 64 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b  oder QueryCoder;
a670: 0a 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64  .struct QueryCod
a680: 65 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  er {.  Parse *pP
a690: 61 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  arse;       /* T
a6a0: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
a6b0: 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  xt */.  NameCont
a6c0: 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20  ext *pNC;    /* 
a6d0: 4e 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72  Namespace of fir
a6e0: 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65  st enclosing que
a6f0: 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  ry */.};.../*.**
a700: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
a710: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
a720: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 6e 20  ries used as an 
a730: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e  expression.** an
a740: 64 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  d IN operators. 
a750: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
a760: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
a770: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
a780: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
a790: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
a7a0: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
a7b0: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
a7c0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
a7d0: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
a7e0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
a7f0: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
a800: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
a810: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
a820: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
a830: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
a840: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
a850: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
a860: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
a870: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
a880: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
a890: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
a8a0: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
a8b0: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23  r subquery..*/.#
a8c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a8d0: 49 54 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64  IT_SUBQUERY.void
a8e0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
a8f0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
a900: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
a910: 29 7b 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64  ){.  int testAdd
a920: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a940: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
a950: 64 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20  dress */.  Vdbe 
a960: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
a970: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
a980: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
a990: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
a9a0: 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e  e must be run in
a9b0: 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76   its entirety ev
a9c0: 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65  ery time it is e
a9d0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
a9e0: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
a9f0: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
aa00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
aa10: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
aa20: 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
aa30: 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
aa40: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
aa50: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
aa60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
aa70: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
aa80: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
aa90: 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
aaa0: 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
aab0: 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
aac0: 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
aad0: 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
aae0: 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
aaf0: 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
ab00: 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
ab10: 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
ab20: 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
ab30: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
ab40: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
ab50: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
ab60: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
ab70: 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72  Select) && !pPar
ab80: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
ab90: 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70  .    int mem = p
aba0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
abb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
abc0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
abd0: 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  d, mem, 0);.    
abe0: 74 65 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74  testAddr = sqlit
abf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ac00: 50 5f 49 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_If, 0, 0);.   
ac10: 20 61 73 73 65 72 74 28 20 74 65 73 74 41 64 64   assert( testAdd
ac20: 72 3e 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  r>0 || sqlite3Ma
ac30: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a  llocFailed() );.
ac40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac50: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
ac60: 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 7d 0a  t, 1, mem);.  }.
ac70: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
ac80: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
ac90: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
aca0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
acb0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
acc0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
acd0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
ace0: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
acf0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
ad00: 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  ruction */..    
ad10: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
ad20: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
ad30: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
ad40: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
ad50: 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
ad60: 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
ad70: 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
ad80: 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
ad90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
ada0: 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
adb0: 6d 65 20 77 61 79 2e 20 41 20 76 69 72 74 75 61  me way. A virtua
adc0: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
add0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
ade0: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
adf0: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
ae00: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
ae10: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
ae20: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
ae30: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
ae40: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
ae50: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
ae60: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
ae70: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
ae80: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
ae90: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
aea0: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
aeb0: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
aec0: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
aed0: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
aee0: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
aef0: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
af00: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
af10: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
af20: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
af30: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
af40: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
af50: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
af60: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
af70: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
af80: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
af90: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
afa0: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
afb0: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
afc0: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
afd0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
afe0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
aff0: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
b000: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b010: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
b020: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b030: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
b040: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b050: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
b060: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
b070: 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65   0);.      memse
b080: 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73  t(&keyInfo, 0, s
b090: 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b  izeof(keyInfo));
b0a0: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e  .      keyInfo.n
b0b0: 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Field = 1;.     
b0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b0d0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
b0e0: 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54  lumns, pExpr->iT
b0f0: 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20  able, 1);..     
b100: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
b110: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
b120: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
b130: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
b140: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
b150: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
b160: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
b170: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
b180: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
b190: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
b1a0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
b1b0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
b1c0: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
b1d0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
b1e0: 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e   iParm = pExpr->
b1f0: 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74  iTable +  (((int
b200: 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b  )affinity)<<16);
b210: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
b220: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t *pEList;.     
b230: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
b240: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
b250: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
b260: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
b270: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
b280: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
b290: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  lect, SRT_Set, i
b2a0: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Parm, 0, 0, 0, 0
b2b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73  );.        pELis
b2c0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
b2d0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
b2e0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
b2f0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
b300: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
b310: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
b320: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
b330: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b340: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
b350: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
b360: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
b370: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b380: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
b390: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
b3a0: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
b3b0: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
b3c0: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
b3d0: 09 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70  .** For each exp
b3e0: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
b3f0: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
b400: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
b410: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
b420: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
b430: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
b440: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
b450: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
b460: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
b470: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
b480: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
b490: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
b4a0: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
b4b0: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
b4c0: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
b4d0: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
b4e0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
b4f0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
b500: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
b510: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  ->pList;.       
b520: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
b530: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20  _item *pItem;.. 
b540: 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
b550: 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
b560: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
b570: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
b580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b590: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
b5a0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
b5b0: 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20  >pColl;..       
b5c0: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
b5d0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
b5e0: 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
b5f0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
b600: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
b610: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
b620: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
b630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
b640: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
b650: 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20  pExpr;..        
b660: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
b670: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
b680: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
b690: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
b6a0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
b6b0: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
b6c0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
b6d0: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
b6e0: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
b6f0: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
b700: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
b710: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
b720: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
b730: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
b740: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
b750: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
b760: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
b770: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
b780: 66 28 20 74 65 73 74 41 64 64 72 3e 30 20 26 26  f( testAddr>0 &&
b790: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
b7a0: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b7c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
b7d0: 6f 6f 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d  oop(v, testAddr-
b7e0: 31 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 3);.         
b7f0: 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b     testAddr = 0;
b800: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
b810: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
b820: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
b830: 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
b840: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
b850: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
b860: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b870: 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a  e(pParse, pE2);.
b880: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b890: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
b8a0: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
b8b0: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
b8c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b8d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b8e0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
b8f0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
b900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b920: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
b930: 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79  dr, (void *)&key
b940: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
b950: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b960: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
b970: 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
b980: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
b990: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68  .      /* This h
b9a0: 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
b9b0: 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
b9c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
b9d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
b9e0: 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
b9f0: 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
ba00: 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
ba10: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
ba20: 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
ba30: 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
ba40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ba50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b  static const Tok
ba60: 65 6e 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29  en one = { (u8*)
ba70: 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20  "1", 0, 1 };.   
ba80: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
ba90: 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b  .      int iMem;
baa0: 0a 20 20 20 20 20 20 69 6e 74 20 73 6f 70 3b 0a  .      int sop;.
bab0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
bac0: 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d 20 3d 20 70  olumn = iMem = p
bad0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
bae0: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
baf0: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
bb00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
bb10: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
bb20: 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f        sop = SRT_
bb30: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Mem;.        sql
bb40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bb50: 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65   OP_MemNull, iMe
bb60: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  m, 0);.        V
bb70: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
bb80: 23 20 49 6e 69 74 20 73 75 62 71 75 65 72 79 20  # Init subquery 
bb90: 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
bba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bbb0: 73 6f 70 20 3d 20 53 52 54 5f 45 78 69 73 74 73  sop = SRT_Exists
bbc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bbd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bbe0: 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 4d 65 6d  _MemInt, 0, iMem
bbf0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
bc00: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e  omment((v, "# In
bc10: 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
bc20: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
bc30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
bc40: 6c 65 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d 69  lete(pSel->pLimi
bc50: 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  t);.      pSel->
bc60: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
bc70: 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c  Expr(TK_INTEGER,
bc80: 20 30 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20   0, 0, &one);.  
bc90: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
bca0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
bcb0: 73 6f 70 2c 20 69 4d 65 6d 2c 20 30 2c 20 30 2c  sop, iMem, 0, 0,
bcc0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
bcd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
bce0: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29    if( testAddr )
bcf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
bd00: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73  eJumpHere(v, tes
bd10: 74 41 64 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  tAddr);.  }.  re
bd20: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
bd30: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
bd40: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
bd50: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
bd60: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
bd70: 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
bd80: 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
bd90: 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
bda0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   on the stack..*
bdb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
bdc0: 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a  deInteger(Vdbe *
bdd0: 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
bde0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
bdf0: 69 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  i;.  if( sqlite3
be00: 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20  GetInt32(z, &i) 
be10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
be20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
be30: 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20  teger, i, 0);.  
be40: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
be50: 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29  3FitsIn64Bits(z)
be60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
be70: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74  dbeOp3(v, OP_Int
be80: 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  64, 0, 0, z, n);
be90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
bea0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
beb0: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a  OP_Real, 0, 0, z
bec0: 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  , n);.  }.}.../*
bed0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
bee0: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
bef0: 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
bf00: 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
bf10: 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
bf20: 20 70 75 73 68 20 74 68 61 74 20 63 6f 6c 75 6d   push that colum
bf30: 6e 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 73  n value on the s
bf40: 74 61 63 6b 2e 20 20 54 68 65 72 65 0a 2a 2a 20  tack.  There.** 
bf50: 69 73 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f  is an open curso
bf60: 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61  r to pTab in iTa
bf70: 62 6c 65 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  ble.  If iColumn
bf80: 3c 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 64 65 20  <0 then.** code 
bf90: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
bfa0: 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
bfb0: 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owid..*/.void sq
bfc0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
bfd0: 43 6f 6c 75 6d 6e 28 56 64 62 65 20 2a 76 2c 20  Column(Vdbe *v, 
bfe0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74  Table *pTab, int
bff0: 20 69 43 6f 6c 75 6d 6e 2c 20 69 6e 74 20 69 54   iColumn, int iT
c000: 61 62 6c 65 29 7b 0a 20 20 69 66 28 20 69 43 6f  able){.  if( iCo
c010: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 69 6e  lumn<0 ){.    in
c020: 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20  t op = (pTab && 
c030: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
c040: 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f   ? OP_VRowid : O
c050: 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 73 71 6c  P_Rowid;.    sql
c060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c070: 20 6f 70 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b   op, iTable, 0);
c080: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
c090: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
c0a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c0b0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c  OP_Column, iTabl
c0c0: 65 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 7d  e, iColumn);.  }
c0d0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
c0e0: 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
c0f0: 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
c100: 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
c110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c120: 70 28 76 2c 20 6f 70 2c 20 69 54 61 62 6c 65 2c  p(v, op, iTable,
c130: 20 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73   iColumn);.    s
c140: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
c150: 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
c160: 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66 20 53  lumn);.#ifndef S
c170: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
c180: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 69 66  ING_POINT.    if
c190: 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ( pTab->aCol[iCo
c1a0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3d 3d  lumn].affinity==
c1b0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
c1c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c1d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c1e0: 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 30 2c  RealAffinity, 0,
c1f0: 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
c200: 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  f.  }.}../*.** G
c210: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
c220: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
c230: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
c240: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
c250: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
c260: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74   the result on t
c270: 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e  he top of stack.
c280: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
c290: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
c2a0: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
c2b0: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
c2c0: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
c2d0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
c2e0: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
c2f0: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
c300: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
c310: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
c320: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
c330: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
c340: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
c350: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
c360: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
c370: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
c380: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
c390: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
c3a0: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
c3b0: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
c3c0: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
c3d0: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
c3e0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
c3f0: 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
c400: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
c410: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
c420: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
c430: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
c440: 6e 74 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31  nt stackChng = 1
c450: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
c460: 66 20 63 68 61 6e 67 65 20 74 6f 20 73 74 61 63  f change to stac
c470: 6b 20 64 65 70 74 68 20 2a 2f 0a 0a 20 20 69 66  k depth */..  if
c480: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
c490: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
c4a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
c4b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
c4c0: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  ll, 0, 0);.    r
c4d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20  eturn;.  }.  op 
c4e0: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
c4f0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
c500: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
c510: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
c520: 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
c530: 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
c540: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
c550: 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
c560: 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
c570: 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
c580: 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
c590: 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
c5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c5b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c5c0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 43 6f 6c  OP_MemLoad, pCol
c5d0: 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
c5e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c5f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
c600: 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
c610: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
c620: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c630: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
c640: 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
c650: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
c680: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 62  lumn);.        b
c690: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c6a0: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
c6b0: 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
c6c0: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
c6d0: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
c6e0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
c6f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
c700: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
c710: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
c720: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
c730: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
c740: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
c750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c760: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3e 30  arse->ckOffset>0
c770: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
c780: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c790: 4f 50 5f 44 75 70 2c 20 70 50 61 72 73 65 2d 3e  OP_Dup, pParse->
c7a0: 63 6b 4f 66 66 73 65 74 2d 70 45 78 70 72 2d 3e  ckOffset-pExpr->
c7b0: 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31 29 3b 0a 20  iColumn-1, 1);. 
c7c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c7d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c7e0: 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 76 2c 20  odeGetColumn(v, 
c7f0: 70 45 78 70 72 2d 3e 70 54 61 62 2c 20 70 45 78  pExpr->pTab, pEx
c800: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 45 78  pr->iColumn, pEx
c810: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
c820: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c840: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
c850: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
c860: 28 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72  (v, (char*)pExpr
c870: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
c880: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
c890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c8a0: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
c8b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
c8c0: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
c8d0: 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d  sert( TK_FLOAT==
c8e0: 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20  OP_Real );.     
c8f0: 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54 52 49   assert( TK_STRI
c900: 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20 29  NG==OP_String8 )
c910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
c920: 65 71 75 6f 74 65 45 78 70 72 28 70 45 78 70 72  equoteExpr(pExpr
c930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c940: 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30  VdbeOp3(v, op, 0
c950: 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 45 78 70  , 0, (char*)pExp
c960: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
c970: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
c980: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c990: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
c9a0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
c9b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c9c0: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
c9d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c9e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c9f0: 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
ca00: 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
ca10: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
ca20: 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
ca30: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73  har *z;.      as
ca40: 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f  sert( TK_BLOB==O
ca50: 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20  P_HexBlob );.   
ca60: 20 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f     n = pExpr->to
ca70: 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20  ken.n - 3;.     
ca80: 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70   z = (char*)pExp
ca90: 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a  r->token.z + 2;.
caa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e        assert( n>
cab0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
cac0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
cad0: 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a  z = "";.      }.
cae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
caf0: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30  eOp3(v, op, 0, 0
cb00: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 62  , z, n);.      b
cb10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
cb20: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
cb30: 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
cb40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb50: 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  p(v, OP_Variable
cb60: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
cb70: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
cb80: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20  Expr->token.n>1 
cb90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
cba0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
cbb0: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78  , -1, (char*)pEx
cbc0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
cbd0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
cbe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
cbf0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
cc00: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
cc10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cc20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
cc30: 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 54  mLoad, pExpr->iT
cc40: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
cc50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
cc60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cc70: 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
cc80: 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
cc90: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
cca0: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
ccb0: 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
ccc0: 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  n) */.      int 
ccd0: 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20  aff, to_op;.    
cce0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ccf0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
cd00: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
cd10: 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ff = sqlite3Affi
cd20: 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d  nityType(&pExpr-
cd30: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74  >token);.      t
cd40: 6f 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c  o_op = aff - SQL
cd50: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f  ITE_AFF_TEXT + O
cd60: 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20  P_ToText;.      
cd70: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
cd80: 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
cd90: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
cda0: 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
cdb0: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
cdc0: 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61  P_ToBlob    || a
cdd0: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
cde0: 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20  ONE    );.      
cdf0: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
ce00: 50 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61  P_ToNumeric || a
ce10: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff!=SQLITE_AFF_N
ce20: 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20  UMERIC );.      
ce30: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
ce40: 50 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61  P_ToInt     || a
ce50: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff!=SQLITE_AFF_I
ce60: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20  NTEGER );.      
ce70: 61 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f  assert( to_op==O
ce80: 50 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61  P_ToReal    || a
ce90: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff!=SQLITE_AFF_R
cea0: 45 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EAL    );.      
ceb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cec0: 28 76 2c 20 74 6f 5f 6f 70 2c 20 30 2c 20 30 29  (v, to_op, 0, 0)
ced0: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
cee0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
cef0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
cf00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
cf10: 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
cf20: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
cf30: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
cf40: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
cf50: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
cf60: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
cf70: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
cf80: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
cf90: 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
cfa0: 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
cfb0: 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
cfc0: 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
cfd0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
cfe0: 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
cff0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d000: 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
d010: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
d020: 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
d030: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d040: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
d050: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
d060: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d070: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
d080: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
d090: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
d0a0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
d0b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
d0c0: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
d0d0: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b   stackChng = -1;
d0e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d0f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
d100: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
d110: 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
d120: 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
d130: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
d140: 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
d150: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
d160: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
d170: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
d180: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
d190: 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
d1a0: 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
d1b0: 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
d1c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
d1d0: 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
d1e0: 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
d1f0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nd );.      asse
d200: 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
d210: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
d220: 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
d230: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
d240: 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f  t( TK_MINUS==OP_
d250: 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20  Subtract );.    
d260: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d    assert( TK_REM
d270: 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29  ==OP_Remainder )
d280: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d290: 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69  TK_BITAND==OP_Bi
d2a0: 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73  tAnd );.      as
d2b0: 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d  sert( TK_BITOR==
d2c0: 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20  OP_BitOr );.    
d2d0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
d2e0: 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
d2f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d300: 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
d310: 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  ftLeft );.      
d320: 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
d330: 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
d340: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
d350: 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
d360: 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20  Concat );.      
d370: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d380: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d390: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
d3a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d3b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
d3c0: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
d3d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
d3e0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
d3f0: 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a  stackChng = -1;.
d400: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d410: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
d420: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
d430: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
d440: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
d450: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
d460: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
d470: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
d480: 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
d490: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
d4a0: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
d4b0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
d4c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
d4d0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
d4e0: 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d  -%.*s", p->n, p-
d4f0: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >z);.        if(
d500: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
d510: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
d520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
d530: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
d540: 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20  0, z, p->n+1);. 
d550: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d560: 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
d570: 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31  ger(v, z, p->n+1
d580: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d590: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
d5a0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  z);.        brea
d5b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d5c0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
d5d0: 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a   into TK_NOT */.
d5e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d5f0: 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
d600: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
d610: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
d620: 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
d630: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d640: 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
d650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d660: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d670: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
d680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d690: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
d6a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
d6b0: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
d6c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d6d0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
d6e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
d6f0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
d700: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61 73  t dest;.      as
d710: 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
d720: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
d730: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
d740: 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
d750: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ll );.      sqli
d760: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d770: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
d780: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d790: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d7a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
d7b0: 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
d7c0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d7d0: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
d7e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d7f0: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
d800: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d810: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d820: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
d830: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
d840: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
d850: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d860: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
d870: 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
d880: 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
d890: 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
d8a0: 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
d8b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d8c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d8d0: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
d8e0: 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20  gregate: %T",.  
d8f0: 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72            &pExpr
d900: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  ->span);.      }
d910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
d920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d930: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 49  , OP_MemLoad, pI
d940: 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
d950: 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30 29  ->iAgg].iMem, 0)
d960: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d970: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d980: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
d990: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
d9a0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
d9b0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
d9c0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
d9d0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
d9e0: 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
d9f0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
da00: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
da10: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
da20: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
da30: 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
da40: 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20  int constMask = 
da50: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
da60: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
da70: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
da80: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
da90: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
daa0: 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78  zId = (char*)pEx
dab0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
dac0: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
dad0: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
dae0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
daf0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
db00: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
db10: 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a  nExpr, enc, 0);.
db20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
db30: 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ef!=0 );.      n
db40: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
db50: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
db60: 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 23  Parse, pList);.#
db70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
db80: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
db90: 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
dba0: 79 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66  y overload the f
dbb0: 75 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66  unction if the f
dbc0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
dbd0: 0a 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74  .      ** a virt
dbe0: 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ual table column
dbf0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
dc00: 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75   ** For infix fu
dc10: 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47  nctions (LIKE, G
dc20: 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64  LOB, REGEXP, and
dc30: 20 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a   MATCH) use the.
dc40: 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
dc50: 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68  argument, not th
dc60: 65 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20  e first, as the 
dc70: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74  argument to test
dc80: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
dc90: 20 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75   if it is a colu
dca0: 6d 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20  mn in a virtual 
dcb0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20  table.  This is 
dcc0: 64 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20  done because.   
dcd0: 20 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f     ** the left o
dce0: 70 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20  perand of infix 
dcf0: 66 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f  functions (the o
dd00: 70 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74  perand we want t
dd10: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72  o.      ** contr
dd20: 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20  ol overloading) 
dd30: 65 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73  ends up as the s
dd40: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
dd50: 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  o the.      ** f
dd60: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78  unction.  The ex
dd70: 70 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62  pression "A glob
dd80: 20 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   B" is equivalen
dd90: 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22  t to .      ** "
dda0: 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77  glob(B,A).  We w
ddb0: 61 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41  ant to use the A
ddc0: 20 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74   in "A glob B" t
ddd0: 6f 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20  o test.      ** 
dde0: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65  for function ove
ddf0: 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77  rloading.  But w
de00: 65 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d  e use the B term
de10: 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e   in "glob(B,A)".
de20: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
de30: 69 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20  if( nExpr>=2 && 
de40: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
de50: 45 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b  EP_InfixFunc) ){
de60: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
de70: 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c  sqlite3VtabOverl
de80: 6f 61 64 46 75 6e 63 74 69 6f 6e 28 70 44 65 66  oadFunction(pDef
de90: 2c 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e  , nExpr, pList->
dea0: 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
deb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 45 78     }else if( nEx
dec0: 70 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  pr>0 ){.        
ded0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
dee0: 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
def0: 6f 6e 28 70 44 65 66 2c 20 6e 45 78 70 72 2c 20  on(pDef, nExpr, 
df00: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
df10: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
df20: 69 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  if.      for(i=0
df30: 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33  ; i<nExpr && i<3
df40: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
df50: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
df60: 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74  IsConstant(pList
df70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
df80: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
df90: 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a  Mask |= (1<<i);.
dfa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dfb0: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
dfc0: 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c  CollSeq && !pCol
dfd0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
dfe0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
dff0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
e000: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
e010: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
e020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e030: 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
e040: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Seq ){.        i
e050: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
e060: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
e070: 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
e080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
e090: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p3(v, OP_CollSeq
e0a0: 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
e0b0: 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45  pColl, P3_COLLSE
e0c0: 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
e0d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
e0e0: 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
e0f0: 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78 70   constMask, nExp
e100: 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  r, (char*)pDef, 
e110: 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
e120: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31     stackChng = 1
e130: 2d 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 62 72  -nExpr;.      br
e140: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
e150: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e160: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
e170: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
e180: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
e190: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
e1a0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
e1b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e1c0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
e1d0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
e1e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e1f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e200: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
e210: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  r->iColumn, 0);.
e220: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
e230: 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75  t((v, "# load su
e240: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
e250: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e260: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e270: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
e280: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61   addr;.      cha
e290: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
e2a0: 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d    int ckOffset =
e2b0: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
e2c0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
e2d0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
e2e0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20  arse, pExpr);.. 
e2f0: 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
e300: 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
e310: 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
e320: 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
e330: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
e340: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
e350: 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
e360: 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
e370: 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
e380: 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20  for.      ** P3 
e390: 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
e3a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e3b0: 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
e3c0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
e3d0: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71  Expr);..      sq
e3e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e3f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
e400: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
e410: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b  e->ckOffset = ck
e420: 4f 66 66 73 65 74 2b 31 3b 0a 0a 20 20 20 20 20  Offset+1;..     
e430: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78   /* Code the <ex
e440: 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
e450: 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20   IN (...)". The 
e460: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
e470: 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e        ** pExpr->
e480: 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  iTable contains 
e490: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
e4a0: 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e  make up the (...
e4b0: 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ) set..      */.
e4c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e4d0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e4e0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
e4f0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
e500: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
e510: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
e520: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e530: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
e540: 64 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20  ddr+4);         
e550: 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a     /* addr + 0 *
e560: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
e570: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
e580: 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  op, 2, 0);.     
e590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5a0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
e5b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e5c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e5d0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b  P_Goto, 0, addr+
e5e0: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
e5f0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
e600: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
e610: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20   &affinity, 1); 
e620: 20 20 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f    /* addr + 4 */
e630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e640: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
e650: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
e660: 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20  le, addr+7);.   
e670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e680: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
e690: 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20  , -1, 0);       
e6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
e6b0: 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20  dr + 6 */..     
e6c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
e6d0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
e6e0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
e6f0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
e700: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
e710: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
e720: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
e730: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
e740: 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
e750: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
e760: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
e770: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e780: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
e790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e7a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
e7b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
e7c0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e7d0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
e7e0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
e7f0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
e800: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c  Right, OP_Ge, 0,
e810: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e820: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e830: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
e840: 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
e850: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
e860: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
e870: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e880: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
e890: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
e8a0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
e8b0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
e8c0: 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Le, 0, 0);.     
e8d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e8e0: 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20  p(v, OP_And, 0, 
e8f0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
e900: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e910: 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
e920: 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
e930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e940: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e950: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
e960: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
e970: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e980: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
e990: 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  E: {.      int e
e9a0: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20  xpr_end_label;. 
e9b0: 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73       int jumpIns
e9c0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
e9d0: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  pr;.      int i;
e9e0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
e9f0: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  *pEList;.      s
ea00: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
ea10: 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a  tem *aListelem;.
ea20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
ea30: 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
ea40: 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
ea50: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  ->pList->nExpr %
ea60: 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
ea70: 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
ea80: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
ea90: 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
eaa0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
eab0: 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
eac0: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
ead0: 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
eae0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
eaf0: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20  xpr_end_label = 
eb00: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
eb10: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
eb20: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
eb30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
eb40: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
eb50: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
eb60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
eb70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
eb80: 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
eb90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
eba0: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
ebb0: 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  lem[i].pExpr);. 
ebc0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
ebd0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
ebe0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ebf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
ec00: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   1, 1);.        
ec10: 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64    jumpInst = cod
ec20: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
ec30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61   pExpr->pLeft, a
ec40: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
ec50: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29      OP_Ne, 0, 1)
ec80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ec90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
eca0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
ecb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ecc0: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
ecd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ece0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
ecf0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
ed00: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
ed10: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ed20: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
ed30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
ed40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed50: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
ed60: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
ed70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ed80: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
ed90: 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20   jumpInst);.    
eda0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
edb0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
edc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
edd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
ede0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
edf0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
ee00: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
ee10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ee20: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
ee30: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
ee40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ee50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee60: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
ee70: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ee80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ee90: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
eea0: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
eeb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eec0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
eed0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
eee0: 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
eef0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
ef00: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
ef10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ef20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ef30: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
ef40: 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
ef50: 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
ef60: 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
ef70: 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
ef80: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d  .return;.      }
ef90: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
efa0: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
efb0: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
efc0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
efd0: 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
efe0: 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
eff0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
f000: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
f010: 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
f020: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
f030: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
f040: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
f050: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
f060: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
f070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
f080: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
f090: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
f0a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  pExpr->iColumn,.
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
f0d0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
f0e0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
f0f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
f100: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f110: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
f120: 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
f130: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f140: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
f150: 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
f160: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
f170: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f180: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
f190: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
f1a0: 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20  noreJump);.     
f1b0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
f1c0: 28 76 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e  (v, "# raise(IGN
f1d0: 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
f1e0: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
f1f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
f200: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
f210: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
f220: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20  e->ckOffset ){. 
f230: 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66     pParse->ckOff
f240: 73 65 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67  set += stackChng
f250: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
f260: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29  arse->ckOffset )
f270: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
f280: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
f290: 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  GGER./*.** Gener
f2a0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
f2b0: 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
f2c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
f2d0: 6c 65 61 76 65 73 20 74 68 65 20 72 65 73 75 6c  leaves the resul
f2e0: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  t.** on the stac
f2f0: 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  k.  See also sql
f300: 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a  ite3ExprCode()..
f310: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f320: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61  ne might also ca
f330: 63 68 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  che the result a
f340: 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45  nd modify the pE
f350: 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74  xpr tree.** so t
f360: 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65  hat it will make
f370: 20 75 73 65 20 6f 66 20 74 68 65 20 63 61 63 68   use of the cach
f380: 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  ed result on sub
f390: 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69  sequent evaluati
f3a0: 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ons.** rather th
f3b0: 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  an evaluate the 
f3c0: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
f3d0: 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c   again.  Trivial
f3e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
f3f0: 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20  .** not cached. 
f400: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
f410: 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20 69 74  on is cached, it
f420: 73 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  s result is stor
f430: 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f  ed in a .** memo
f440: 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  ry location..*/.
f450: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
f460: 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
f470: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
f480: 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65   *pExpr){.  Vdbe
f490: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f4a0: 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
f4b0: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
f4c0: 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dr2;.  if( v==0 
f4d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72  ) return;.  addr
f4e0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
f4f0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f510: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
f520: 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74  .  addr2 = sqlit
f530: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f540: 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72  r(v);.  if( addr
f550: 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c  2>addr1+1 || sql
f560: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
f570: 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d   addr1)->opcode=
f580: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a  =OP_Function ){.
f590: 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72      iMem = pExpr
f5a0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
f5b0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
f5c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f5d0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
f5e0: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45  iMem, 0);.    pE
f5f0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
f600: 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ISTER;.  }.}.#en
f610: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
f620: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
f630: 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
f640: 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
f650: 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
f660: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
f670: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
f680: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
f690: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
f6a0: 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
f6b0: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
f6c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
f6d0: 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
f6e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
f6f0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
f700: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
f710: 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68   *pList    /* Th
f720: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
f730: 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
f740: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
f750: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
f760: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
f770: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
f780: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
f790: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
f7a0: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
f7b0: 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d  >a, i=n; i>0; i-
f7c0: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
f7d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f7e0: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
f7f0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
f800: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
f810: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
f820: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
f830: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
f840: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
f850: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
f860: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
f870: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
f880: 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
f890: 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
f8a0: 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
f8b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f8c0: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
f8d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
f8e0: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
f8f0: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
f900: 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
f910: 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
f920: 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
f930: 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e  ll flag is true.
f940: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
f950: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
f960: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
f970: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
f980: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
f990: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
f9a0: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
f9b0: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
f9c0: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
f9d0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
f9e0: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
f9f0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
fa00: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
fa10: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
fa20: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
fa30: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
fa40: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
fa50: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
fa60: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
fa70: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
fa80: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
fa90: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
faa0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
fab0: 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
fac0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
fad0: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
fae0: 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
faf0: 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
fb00: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
fb10: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
fb20: 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50  nt ckOffset = pP
fb30: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a  arse->ckOffset;.
fb40: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
fb50: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
fb60: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
fb70: 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
fb80: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
fb90: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
fba0: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
fbb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
fbc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
fbd0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
fbe0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
fbf0: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20   !jumpIfNull);. 
fc00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fc10: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
fc20: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
fc30: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
fc40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fc50: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
fc60: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
fc70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fc80: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
fc90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
fca0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
fcb0: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
fcc0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
fcd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
fce0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
fcf0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
fd00: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
fd10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fd20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
fd30: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
fd40: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
fd50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
fd60: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
fd70: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
fd80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fd90: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
fda0: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
fdb0: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
fdc0: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
fdd0: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
fde0: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
fdf0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
fe00: 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
fe10: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
fe20: 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
fe30: 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
fe40: 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
fe50: 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
fe60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
fe70: 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
fe80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fe90: 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
fea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
feb0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
fec0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
fed0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
fee0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
fef0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
ff00: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
ff10: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
ff20: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
ff30: 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
ff40: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
ff50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ff60: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
ff70: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
ff80: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
ff90: 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
ffa0: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
ffb0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
ffc0: 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
ffd0: 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
ffe0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
fff0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
10000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10010 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
10020 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
10030 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10040 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
10050 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
10060 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42   expression "x B
10070 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20  ETWEEN y AND z" 
10080 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
10090 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
100a0 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79    ** 1 IF (x < y
100b0 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
100c0 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20  * 2 IF (x <= z) 
100d0 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
100e0 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20    ** 3 ....     
100f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
10100 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  dr;.      Expr *
10110 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
10120 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
10130 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
10140 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
10150 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
10160 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10170 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
10180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10190 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
101a0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
101b0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
101c0 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
101d0 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70   addr = codeComp
101e0 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
101f0 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74  t, pRight, OP_Lt
10200 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  , 0, !jumpIfNull
10210 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74  );..      pRight
10220 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
10230 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
10240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10250 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
10260 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
10270 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
10280 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
10290 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  Le, dest, jumpIf
102a0 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71  Null);..      sq
102b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
102c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
102d0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
102e0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
102f0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73  , addr);.      s
10300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10310 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
10320 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10330 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
10340 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
10350 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10360 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
10370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10380 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49  (v, OP_If, jumpI
10390 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
103a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
103b0 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63  .  }.  pParse->c
103c0 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73  kOffset = ckOffs
103d0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
103e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
103f0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
10400 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
10410 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
10420 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
10430 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
10440 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
10450 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
10460 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
10470 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
10480 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
10490 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
104a0 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
104b0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
104c0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
104d0 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
104e0 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
104f0 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c   is true or fall
10500 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
10510 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e  IfNull is false.
10520 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10530 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
10540 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
10550 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
10560 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
10570 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
10580 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
10590 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
105a0 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61  t ckOffset = pPa
105b0 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20  rse->ckOffset;. 
105c0 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
105d0 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
105e0 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
105f0 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
10600 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
10610 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
10620 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
10630 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
10640 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
10650 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
10660 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
10670 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
10680 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
10690 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
106a0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
106b0 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
106c0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
106d0 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
106e0 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
106f0 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
10700 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
10710 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
10720 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
10730 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
10740 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
10750 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
10760 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
10770 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
10780 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
10790 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
107a0 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
107b0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
107c0 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
107d0 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
107e0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
107f0 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
10800 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
10810 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
10820 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
10830 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
10840 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
10850 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
10860 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
10870 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
10880 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
10890 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
108a0 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
108b0 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
108c0 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
108d0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
108e0 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
108f0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
10900 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
10910 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
10920 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
10930 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
10940 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
10950 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
10960 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
10970 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
10980 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
10990 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
109a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
109b0 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
109c0 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
109d0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
109e0 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
109f0 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
10a00 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
10a10 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
10a20 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
10a30 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
10a40 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
10a50 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
10a60 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
10a70 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
10a80 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
10a90 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
10aa0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
10ab0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
10ac0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10ad0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
10ae0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
10af0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
10b00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
10b10 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
10b20 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
10b30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
10b40 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
10b50 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
10b60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
10b70 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
10b80 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
10b90 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
10ba0 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
10bb0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
10bc0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
10bd0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
10be0 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
10bf0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
10c00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10c10 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
10c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10c30 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
10c40 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
10c50 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
10c60 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10c70 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
10c80 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
10c90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10ca0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
10cb0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
10cc0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
10cd0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
10ce0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
10cf0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
10d00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10d10 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
10d20 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
10d30 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10d40 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
10d50 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
10d60 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
10d70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
10d80 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
10d90 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
10da0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10db0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10dc0 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
10dd0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
10de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10df0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
10e00 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
10e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10e20 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
10e30 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
10e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10e50 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
10e60 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
10e70 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54  ession is "x BET
10e80 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49  WEEN y AND z". I
10e90 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  t is implemented
10ea0 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
10eb0 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e      ** 1 IF (x >
10ec0 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  = y) GOTO 3.    
10ed0 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73    ** 2 GOTO <des
10ee0 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46  t>.      ** 3 IF
10ef0 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64   (x > z) GOTO <d
10f00 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  est>.      */.  
10f10 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
10f20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
10f30 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
10f40 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
10f50 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
10f60 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
10f70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10f80 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
10f90 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
10fa0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10fb0 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
10fc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10fd0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
10fe0 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ht);.      addr 
10ff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
11000 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
11010 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
11020 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
11030 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64  ight, OP_Ge, add
11040 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  r+3, !jumpIfNull
11050 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
11060 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11070 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
11080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11090 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
110a0 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
110b0 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
110c0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
110d0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
110e0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
110f0 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
11100 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
11110 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
11120 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20  t, OP_Gt, dest, 
11130 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
11140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11150 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11160 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11170 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
11180 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
11190 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
111a0 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e  P_IfNot, jumpIfN
111b0 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
111c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
111d0 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f   }.  pParse->ckO
111e0 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74  ffset = ckOffset
111f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
11200 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
11210 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
11220 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
11230 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
11240 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20  .** if they are 
11250 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65  identical and re
11260 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
11270 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
11280 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65   way..**.** Some
11290 74 69 6d 65 73 20 74 68 69 73 20 72 6f 75 74 69  times this routi
112a0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 46  ne will return F
112b0 41 4c 53 45 20 65 76 65 6e 20 69 66 20 74 68 65  ALSE even if the
112c0 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
112d0 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
112e0 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
112f0 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
11300 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
11310 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
11320 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
11330 46 41 4c 53 45 20 6a 75 73 74 20 74 6f 20 62 65  FALSE just to be
11340 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
11350 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
11360 74 75 72 6e 73 20 66 61 6c 73 65 2c 20 74 68 65  turns false, the
11370 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61  n you do not rea
11380 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72  lly know for cer
11390 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a  tain if the two.
113a0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
113b0 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  re the same.  Bu
113c0 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20 54  t if you get a T
113d0 52 55 45 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  RUE return, then
113e0 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
113f0 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
11400 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
11410 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
11420 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
11430 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
11440 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
11450 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
11460 20 46 41 4c 53 45 20 2d 20 74 68 61 74 0a 2a 2a   FALSE - that.**
11470 20 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75   just might resu
11480 6c 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68  lt in some sligh
11490 74 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e  tly slower code.
114a0 20 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a    But returning.
114b0 2a 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  ** an incorrect 
114c0 54 52 55 45 20 63 6f 75 6c 64 20 6c 65 61 64 20  TRUE could lead 
114d0 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e  to a malfunction
114e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
114f0 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
11500 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
11510 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
11520 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a  pA==0||pB==0 ){.
11530 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
11540 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  A;.  }.  if( pA-
11550 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65  >op!=pB->op ) re
11560 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
11570 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
11580 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
11590 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
115a0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
115b0 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
115c0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
115d0 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
115e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
115f0 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
11600 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
11610 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
11620 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
11630 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  A->pList ){.    
11640 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30  if( pB->pList==0
11650 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
11660 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e   if( pA->pList->
11670 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74  nExpr!=pB->pList
11680 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
11690 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
116a0 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45   i<pA->pList->nE
116b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
116c0 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
116d0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69  rCompare(pA->pLi
116e0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
116f0 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pB->pList->a[i].
11700 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
11710 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
11720 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
11730 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20  e if( pB->pList 
11740 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
11750 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70  .  }.  if( pA->p
11760 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53  Select || pB->pS
11770 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
11780 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62  ;.  if( pA->iTab
11790 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c  le!=pB->iTable |
117a0 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  | pA->iColumn!=p
117b0 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
117c0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
117d0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op!=TK_COLUMN &
117e0 26 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b  & pA->token.z ){
117f0 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b  .    if( pB->tok
11800 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  en.z==0 ) return
11810 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   0;.    if( pB->
11820 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b  token.n!=pA->tok
11830 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  en.n ) return 0;
11840 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11850 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
11860 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61  pA->token.z,(cha
11870 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70  r*)pB->token.z,p
11880 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29  B->token.n)!=0 )
11890 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
118a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
118b0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 1;.}.../*.*
118c0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
118d0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
118e0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61  nfo->aCol[] arra
118f0 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  y.  Return the i
11900 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ndex of.** the n
11910 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74  ew element.  Ret
11920 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
11930 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20  umber if malloc 
11940 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
11950 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43   int addAggInfoC
11960 6f 6c 75 6d 6e 28 41 67 67 49 6e 66 6f 20 2a 70  olumn(AggInfo *p
11970 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Info){.  int i;.
11980 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72    i = sqlite3Arr
11990 61 79 41 6c 6c 6f 63 61 74 65 28 26 70 49 6e 66  ayAllocate(&pInf
119a0 6f 2d 3e 61 43 6f 6c 2c 20 73 69 7a 65 6f 66 28  o->aCol, sizeof(
119b0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c  pInfo->aCol[0]),
119c0 20 33 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29   3);.  if( i<0 )
119d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
119e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
119f0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
11a00 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
11a10 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
11a20 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
11a30 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
11a40 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
11a50 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
11a60 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
11a70 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
11a80 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
11a90 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
11aa0 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29  (AggInfo *pInfo)
11ab0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
11ac0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
11ad0 6f 63 61 74 65 28 26 70 49 6e 66 6f 2d 3e 61 46  ocate(&pInfo->aF
11ae0 75 6e 63 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  unc, sizeof(pInf
11af0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 20 32 29  o->aFunc[0]), 2)
11b00 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
11b10 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
11b20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  }.  return i;.} 
11b30 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
11b40 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20  is an xFunc for 
11b50 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75  walkExprTree() u
11b60 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
11b70 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72   .** sqlite3Expr
11b80 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
11b90 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
11ba0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
11bb0 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
11bc0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
11bd0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
11be0 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
11bf0 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
11c00 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70  function at pExp
11c10 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
11c20 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
11c30 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78  e(void *pArg, Ex
11c40 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
11c50 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
11c60 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43  xt *pNC = (NameC
11c70 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20  ontext *)pArg;. 
11c80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
11c90 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
11ca0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
11cb0 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
11cc0 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
11cd0 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
11ce0 67 67 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77  ggInfo;.  ..  sw
11cf0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
11d00 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
11d10 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
11d20 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
11d30 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
11d40 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f  to see if the co
11d50 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f  lumn is in one o
11d60 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
11d70 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a  the FROM.      *
11d80 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  * clause of the 
11d90 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
11da0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  */.      if( pSr
11db0 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  cList ){.       
11dc0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
11dd0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
11de0 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
11df0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
11e00 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
11e10 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
11e20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
11e30 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
11e40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
11e50 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
11e60 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a  tem->iCursor ){.
11e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11e80 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
11e90 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
11ea0 74 68 61 74 20 70 45 78 70 72 20 72 65 66 65 72  that pExpr refer
11eb0 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20  s to a table.   
11ec0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
11ed0 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20   is in the FROM 
11ee0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
11ef0 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 20 20  gregate query.  
11f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  .            **.
11f10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d              ** M
11f20 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
11f30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70   the column in p
11f40 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
11f50 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 20  if there.       
11f60 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
11f70 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c  n entry there al
11f80 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20  ready..         
11f90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
11fa0 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
11fb0 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41 67 67       pCol = pAgg
11fc0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  Info->aCol;.    
11fd0 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
11fe0 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   k<pAggInfo->nCo
11ff0 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b  lumn; k++, pCol+
12000 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
12010 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54 61 62    if( pCol->iTab
12020 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
12030 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
12040 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
12050 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
12060 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
12070 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
12090 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
120a0 20 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d           if( k>=
120b0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
120c0 6e 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67 67  n && (k = addAgg
120d0 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 41 67 67 49  InfoColumn(pAggI
120e0 6e 66 6f 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  nfo))>=0 ){.    
120f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
12100 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
12110 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [k];.           
12120 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20     pCol->pTab = 
12130 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
12140 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
12150 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  >iTable = pExpr-
12160 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
12170 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f         pCol->iCo
12180 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
12190 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20  olumn;.         
121a0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20       pCol->iMem 
121b0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
121c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
121d0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
121e0 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
121f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45          pCol->pE
12200 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
12210 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
12220 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
12230 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
12240 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20       int j, n;. 
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
12260 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70  xprList *pGB = p
12270 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42  AggInfo->pGroupB
12280 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y;.             
12290 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
122a0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d  st_item *pTerm =
122b0 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20   pGB->a;.       
122c0 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42           n = pGB
122d0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
122e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
122f0 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72  ; j<n; j++, pTer
12300 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
12310 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
12320 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
12330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12340 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
12350 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e  K_COLUMN && pE->
12360 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
12370 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12390 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  E->iColumn==pExp
123a0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
123d0 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
123f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12410 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
12440 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
12450 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
12460 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
12470 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67  rterColumn = pAg
12480 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43  gInfo->nSortingC
12490 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  olumn++;.       
124a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
124b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
124c0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
124d0 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  ow an entry for 
124e0 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66  pExpr in pAggInf
124f0 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65  o->aCol[] (eithe
12500 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
12510 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20   because it was 
12520 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20  there before or 
12530 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20  because we just 
12540 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20  created it)..   
12550 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76           ** Conv
12560 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f  ert the pExpr to
12570 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c   be a TK_AGG_COL
12580 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f  UMN referring to
12590 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
125a0 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61    ** pAggInfo->a
125b0 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20  Col[] entry..   
125c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
125d0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
125e0 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
125f0 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
12600 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
12610 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
12620 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
12630 67 67 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  gg = k;.        
12640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12650 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20       } /* endif 
12660 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
12670 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f  Item->iCursor */
12680 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
12690 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63  d loop over pSrc
126a0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  List */.      }.
126b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
126c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
126d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
126e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  {.      /* The p
126f0 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65  NC->nDepth==0 te
12700 73 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67  st causes aggreg
12710 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
12720 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20   subqueries.    
12730 20 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72    ** to be ignor
12740 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
12750 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29  pNC->nDepth==0 )
12760 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
12770 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78  ck to see if pEx
12780 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  pr is a duplicat
12790 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67  e of another agg
127a0 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20  regate .        
127b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ** function that
127c0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
127d0 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75  he pAggInfo stru
127e0 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f  cture.        */
127f0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12800 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49  AggInfo_func *pI
12810 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  tem = pAggInfo->
12820 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66  aFunc;.        f
12830 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
12840 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
12850 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
12860 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12870 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d  xprCompare(pItem
12880 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20  ->pExpr, pExpr) 
12890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
128a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
128b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
128c0 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
128d0 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20  nfo->nFunc ){.  
128e0 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72          /* pExpr
128f0 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d   is original.  M
12900 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ake a new entry 
12910 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  in pAggInfo->aFu
12920 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  nc[].          *
12930 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  /.          u8 e
12940 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
12950 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >db);.          
12960 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75  i = addAggInfoFu
12970 6e 63 28 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  nc(pAggInfo);.  
12980 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
12990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
129a0 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66  pItem = &pAggInf
129b0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20  o->aFunc[i];.   
129c0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
129d0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
129e0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
129f0 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
12a00 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
12a10 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
12a20 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
12a30 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
12a40 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
12a50 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45         (char*)pE
12a60 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
12a70 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20  xpr->token.n,.  
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20   pExpr->pList ? 
12aa0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
12ab0 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
12ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12ad0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
12ae0 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
12b00 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
12b10 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
12b30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
12b40 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
12b50 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
12b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12b70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12b80 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
12b90 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
12ba0 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
12bb0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
12bc0 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
12bd0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
12be0 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  gg = i;.        
12bf0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
12c00 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
12c10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12c30 0a 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c  .  /* Recursivel
12c40 79 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65  y walk subquerie
12c50 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b  s looking for TK
12c60 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68  _COLUMN nodes th
12c70 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20  at need.  ** to 
12c80 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  be changed to TK
12c90 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75  _AGG_COLUMN.  Bu
12ca0 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70  t increment nDep
12cb0 74 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  th so that.  ** 
12cc0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
12cd0 6e 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65 72  nodes in subquer
12ce0 69 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68  ies will be unch
12cf0 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
12d00 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
12d10 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65   ){.    pNC->nDe
12d20 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53  pth++;.    walkS
12d30 65 6c 65 63 74 45 78 70 72 28 70 45 78 70 72 2d  electExpr(pExpr-
12d40 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a  >pSelect, analyz
12d50 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29  eAggregate, pNC)
12d60 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74  ;.    pNC->nDept
12d70 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  h--;.  }.  retur
12d80 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
12d90 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20  alyze the given 
12da0 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
12db0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
12dc0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
12dd0 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
12de0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
12df0 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61  added to the pPa
12e00 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
12e10 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74  y..** Make addit
12e20 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f  ional entries to
12e30 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
12e40 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63  g[] array as nec
12e50 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  essary..**.** Th
12e60 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
12e70 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
12e80 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65   after the expre
12e90 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a  ssion has been.*
12ea0 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71  * analyzed by sq
12eb0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
12ec0 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Names()..**.** I
12ed0 66 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65  f errors are see
12ee0 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  n, leave an erro
12ef0 72 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72  r message in zEr
12f00 72 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a  rMsg and return.
12f10 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
12f20 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
12f30 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
12f40 7a 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d  zeAggregates(Nam
12f50 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
12f60 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
12f70 6e 74 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70  nt nErr = pNC->p
12f80 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77  Parse->nErr;.  w
12f90 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
12fa0 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  r, analyzeAggreg
12fb0 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74  ate, pNC);.  ret
12fc0 75 72 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  urn pNC->pParse-
12fd0 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a  >nErr - nErr;.}.
12fe0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
12ff0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
13000 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
13010 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
13020 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
13030 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
13040 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13050 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
13060 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
13070 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
13080 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
13090 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
130a0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
130b0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
130c0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
130d0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
130e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
130f0 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  m;.  int i;.  in
13100 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66  t nErr = 0;.  if
13110 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
13120 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
13130 61 2c 20 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  a, i=0; nErr==0 
13140 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  && i<pList->nExp
13150 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
13160 7b 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20  {.      nErr += 
13170 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
13180 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
13190 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
131a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
131b0 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a              urn nErr;.}.