/ Hex Artifact Content
Login

Artifact 7815bdb27152e0b9025a089608403f7fa5d279ec:


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 37 38 20 32 30 30 37 2f 30 32 2f 32 34 20  .278 2007/02/24 
0220: 31 31 3a 35 32 3a 35 33 20 64 72 68 20 45 78 70  11:52:53 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 28 76 6f 69 64 2a 2a 29 26 70 50 61  ree((void**)&pPa
3110: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
3140: 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a  VarExprAlloc*siz
3150: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61  eof(pParse->apVa
3160: 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20 20  rExpr[0]) );.   
3170: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
3180: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
3190: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 20 20 20  led() ){.       
31a0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
31b0: 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b  >apVarExpr!=0 );
31c0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
31d0: 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72 73  >apVarExpr[pPars
31e0: 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d  e->nVarExpr++] =
31f0: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a   pExpr;.      }.
3200: 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a      }.  } .}../*
3210: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
3220: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
3230: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
3240: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
3250: 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  lete(Expr *p){. 
3260: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3270: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61  rn;.  if( p->spa
3280: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72  n.dyn ) sqliteFr
3290: 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  ee((char*)p->spa
32a0: 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74  n.z);.  if( p->t
32b0: 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  oken.dyn ) sqlit
32c0: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  eFree((char*)p->
32d0: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  token.z);.  sqli
32e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
32f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74  >pLeft);.  sqlit
3300: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
3310: 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74  pRight);.  sqlit
3320: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
3330: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71  (p->pList);.  sq
3340: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3350: 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  e(p->pSelect);. 
3360: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
3370: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70  }../*.** The Exp
3380: 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69  r.token field mi
3390: 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67 20  ght be a string 
33a0: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73 20  literal that is 
33b0: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f  quoted..** If so
33c0: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f  , remove the quo
33d0: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f  tation marks..*/
33e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71  .void sqlite3Deq
33f0: 75 6f 74 65 45 78 70 72 28 45 78 70 72 20 2a 70  uoteExpr(Expr *p
3400: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
3410: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
3420: 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20  P_Dequoted) ){. 
3430: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3440: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
3450: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
3460: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
3470: 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73  .dyn==0 ){.    s
3480: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
3490: 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74  &p->token, &p->t
34a0: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  oken);.  }.  sql
34b0: 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68 61  ite3Dequote((cha
34c0: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  r*)p->token.z);.
34d0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  }.../*.** The fo
34e0: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
34f0: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
3500: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
3510: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
3520: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
3530: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
3540: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
3550: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
3560: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
3570: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
3580: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
3590: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
35a0: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
35b0: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
35c0: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
35d0: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
35e0: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
35f0: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
3600: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
3610: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
3620: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
3630: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
3640: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
3650: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
3660: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
3670: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
3680: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
3690: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
36a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
36b0: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
36c0: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
36d0: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
36e0: 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  cated..*/.Expr *
36f0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 45  sqlite3ExprDup(E
3700: 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  xpr *p){.  Expr 
3710: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
3720: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3730: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
3740: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
3750: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
3760: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3770: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70    memcpy(pNew, p
3780: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
3790: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
37a0: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  .z!=0 ){.    pNe
37b0: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 28 75 38  w->token.z = (u8
37c0: 2a 29 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  *)sqliteStrNDup(
37d0: 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e  (char*)p->token.
37e0: 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  z, p->token.n);.
37f0: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
3800: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
3810: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
3820: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  ew->token.z==0 )
3830: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70  ;.  }.  pNew->sp
3840: 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77  an.z = 0;.  pNew
3850: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
3860: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66  3ExprDup(p->pLef
3870: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  t);.  pNew->pRig
3880: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
3890: 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  Dup(p->pRight);.
38a0: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
38b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
38c0: 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  up(p->pList);.  
38d0: 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20  pNew->pSelect = 
38e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
38f0: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
3900: 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 2d 3e  pNew->pTab = p->
3910: 70 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 70  pTab;.  return p
3920: 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  New;.}.void sqli
3930: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b  te3TokenCopy(Tok
3940: 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a  en *pTo, Token *
3950: 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54  pFrom){.  if( pT
3960: 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  o->dyn ) sqliteF
3970: 72 65 65 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e  ree((char*)pTo->
3980: 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  z);.  if( pFrom-
3990: 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e  >z ){.    pTo->n
39a0: 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20   = pFrom->n;.   
39b0: 20 70 54 6f 2d 3e 7a 20 3d 20 28 75 38 2a 29 73   pTo->z = (u8*)s
39c0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68  qliteStrNDup((ch
39d0: 61 72 2a 29 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46  ar*)pFrom->z, pF
39e0: 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f  rom->n);.    pTo
39f0: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  ->dyn = 1;.  }el
3a00: 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  se{.    pTo->z =
3a10: 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69   0;.  }.}.ExprLi
3a20: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
3a30: 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20  istDup(ExprList 
3a40: 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  *p){.  ExprList 
3a50: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
3a60: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
3a70: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
3a80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
3a90: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3aa0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3ab0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
3ac0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
3ad0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3ae0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72  0;.  pNew->nExpr
3af0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
3b00: 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e  = p->nExpr;.  pN
3b10: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
3b20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
3b30: 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d  >nExpr*sizeof(p-
3b40: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
3b50: 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pItem==0 ){.    
3b60: 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29  sqliteFree(pNew)
3b70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
3b80: 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20    } .  pOldItem 
3b90: 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  = p->a;.  for(i=
3ba0: 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69  0; i<p->nExpr; i
3bb0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c  ++, pItem++, pOl
3bc0: 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  dItem++){.    Ex
3bd0: 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70  pr *pNewExpr, *p
3be0: 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74  OldExpr;.    pIt
3bf0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77  em->pExpr = pNew
3c00: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
3c10: 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d  prDup(pOldExpr =
3c20: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
3c30: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45  );.    if( pOldE
3c40: 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26  xpr->span.z!=0 &
3c50: 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20  & pNewExpr ){.  
3c60: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61      /* Always ma
3c70: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
3c80: 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65   span for top-le
3c90: 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  vel expressions 
3ca0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
3cb0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
3cc0: 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53    The logic in S
3cd0: 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67  ELECT processing
3ce0: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
3cf0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61  .      ** the na
3d00: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  mes of columns i
3d10: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
3d20: 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f   needs this info
3d30: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
3d40: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
3d50: 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  y(&pNewExpr->spa
3d60: 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70  n, &pOldExpr->sp
3d70: 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  an);.    }.    a
3d80: 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d  ssert( pNewExpr=
3d90: 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e  =0 || pNewExpr->
3da0: 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20  span.z!=0 .     
3db0: 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78         || pOldEx
3dc0: 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 0a 20 20  pr->span.z==0.  
3dd0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
3de0: 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64  ite3MallocFailed
3df0: 28 29 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  () );.    pItem-
3e00: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
3e10: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
3e20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
3e30: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
3e40: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
3e50: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69  er;.    pItem->i
3e60: 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  sAgg = pOldItem-
3e70: 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65  >isAgg;.    pIte
3e80: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  m->done = 0;.  }
3e90: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73  }../*.** If curs
3eb0: 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76  ors, triggers, v
3ec0: 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
3ed0: 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74  ies are all omit
3ee0: 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
3ef0: 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65  build, then none
3f00: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3f10: 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65  g routines, exce
3f20: 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  pt for .** sqlit
3f30: 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63  e3SelectDup(), c
3f40: 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71  an be called. sq
3f50: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29  lite3SelectDup()
3f60: 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a   is sometimes.**
3f70: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e   called with a N
3f80: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
3f90: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
3fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
3fb0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
3fc0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
3fd0: 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28   \. || !defined(
3fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3ff0: 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73  UERY).SrcList *s
4000: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
4010: 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
4020: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
4030: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
4040: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
4050: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
4060: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
4070: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
4080: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
4090: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
40a0: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
40b0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42  iteMallocRaw( nB
40c0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
40d0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
40e0: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
40f0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
4100: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
4110: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
4120: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
4130: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
4140: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
4150: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
4160: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
4170: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
4180: 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ];.    Table *pT
4190: 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ab;.    pNewItem
41a0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
41b0: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
41c0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
41d0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
41e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
41f0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
4200: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
4210: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
4220: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
4230: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
4240: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
4250: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
4260: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
4270: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
4280: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
4290: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
42a0: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  m->isPopulated =
42b0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 50 6f 70   pOldItem->isPop
42c0: 75 6c 61 74 65 64 3b 0a 20 20 20 20 70 54 61 62  ulated;.    pTab
42d0: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
42e0: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
42f0: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
4300: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
4310: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
4320: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
4330: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
4340: 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  ectDup(pOldItem-
4350: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70  >pSelect);.    p
4360: 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73  NewItem->pOn = s
4370: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
4380: 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  ldItem->pOn);.  
4390: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69    pNewItem->pUsi
43a0: 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  ng = sqlite3IdLi
43b0: 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  stDup(pOldItem->
43c0: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
43d0: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
43e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
43f0: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
4400: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
4410: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
4420: 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  p(IdList *p){.  
4430: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
4440: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
4450: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4460: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
4470: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
4480: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
4490: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
44a0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
44b0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
44c0: 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e  p->nId;.  pNew->
44d0: 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  a = sqliteMalloc
44e0: 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  Raw( p->nId*size
44f0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
4500: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
4510: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
4520: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  e(pNew);.    ret
4530: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  urn 0;.  }.  for
4540: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20  (i=0; i<p->nId; 
4550: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
4560: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e   IdList_item *pN
4570: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
4580: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
4590: 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f   IdList_item *pO
45a0: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
45b0: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
45c0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
45d0: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
45e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
45f0: 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64  Item->idx = pOld
4600: 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20  Item->idx;.  }. 
4610: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
4620: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
4630: 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74 20  electDup(Select 
4640: 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  *p){.  Select *p
4650: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
4660: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
4670: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
4680: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29  cRaw( sizeof(*p)
4690: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
46a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
46b0: 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74  pNew->isDistinct
46c0: 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74   = p->isDistinct
46d0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74  ;.  pNew->pEList
46e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
46f0: 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73 74 29  stDup(p->pEList)
4700: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
4710: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
4720: 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70  up(p->pSrc);.  p
4730: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  New->pWhere = sq
4740: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
4750: 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d  pWhere);.  pNew-
4760: 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
4770: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
4780: 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70  ->pGroupBy);.  p
4790: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  New->pHaving = s
47a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
47b0: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65  >pHaving);.  pNe
47c0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
47d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
47e0: 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  (p->pOrderBy);. 
47f0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f   pNew->op = p->o
4800: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  p;.  pNew->pPrio
4810: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
4820: 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b  tDup(p->pPrior);
4830: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
4840: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4850: 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70  (p->pLimit);.  p
4860: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
4870: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
4880: 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e 65  >pOffset);.  pNe
4890: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  w->iLimit = -1;.
48a0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
48b0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  = -1;.  pNew->is
48c0: 52 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73  Resolved = p->is
48d0: 52 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77  Resolved;.  pNew
48e0: 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41  ->isAgg = p->isA
48f0: 67 67 3b 0a 20 20 70 4e 65 77 2d 3e 75 73 65 73  gg;.  pNew->uses
4900: 45 70 68 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Ephm = 0;.  pNew
4910: 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
4920: 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  y = 0;.  pNew->p
4930: 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
4940: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
4950: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
4960: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
4970: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
4980: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
4990: 32 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  2] = -1;.  retur
49a0: 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a  n pNew;.}.#else.
49b0: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
49c0: 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74 20  electDup(Select 
49d0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
49e0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
49f0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
4a00: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
4a10: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
4a20: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
4a30: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
4a40: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
4a50: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
4a60: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
4a70: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78  sion list..*/.Ex
4a80: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
4a90: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78  xprListAppend(Ex
4aa0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45  prList *pList, E
4ab0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
4ac0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28  n *pName){.  if(
4ad0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
4ae0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
4af0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
4b00: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
4b10: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
4b20: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
4b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
4b40: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rt( pList->nAllo
4b50: 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  c==0 );.  }.  if
4b60: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c  ( pList->nAlloc<
4b70: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  =pList->nExpr ){
4b80: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
4b90: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
4ba0: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
4bb0: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
4bc0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
4bd0: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e  lloc(pList->a, n
4be0: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
4bf0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
4c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
4c10: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
4c20: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
4c30: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
4c40: 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61  loc = n;.  }.  a
4c50: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
4c60: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  =0 );.  if( pExp
4c70: 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20  r || pName ){.  
4c80: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
4c90: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
4ca0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
4cb0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
4cc0: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
4cd0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
4ce0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
4cf0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
4d00: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
4d10: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
4d20: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
4d30: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
4d40: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
4d50: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
4d60: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
4d70: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
4d80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4d90: 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71  ete(pExpr);.  sq
4da0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
4db0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
4dc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4dd0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
4de0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
4df0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
4e00: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4e10: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
4e20: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
4e30: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
4e40: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
4e50: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
4e60: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
4e70: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
4e80: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
4e90: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
4ea0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
4eb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
4ec0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
4ed0: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
4ee0: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
4ef0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
4f00: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
4f10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
4f20: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
4f30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
4f40: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
4f50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
4f60: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
4f70: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
4f80: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
4f90: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
4fa0: 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65  Call xFunc for e
4fb0: 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64  ach node visited
4fc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
4fd0: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46  rn value from xF
4fe0: 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77  unc determines w
4ff0: 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20  hether the tree 
5000: 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  walk continues..
5010: 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69  ** 0 means conti
5020: 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  nue walking the 
5030: 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64  tree.  1 means d
5040: 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64  o not walk child
5050: 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75  ren.** of the cu
5060: 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63  rrent node but c
5070: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62  ontinue with sib
5080: 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20  lings.  2 means 
5090: 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74  abandon.** the t
50a0: 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74  ree walk complet
50b0: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ely..**.** The r
50c0: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
50d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
50e0: 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68   1 to abandon th
50f0: 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61  e tree walk.** a
5100: 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  nd 0 to continue
5110: 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20  ..**.** NOTICE: 
5120: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
5130: 65 73 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64  es *not* descend
5140: 20 69 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73   into subqueries
5150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5160: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70  walkExprList(Exp
5170: 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29  rList *, int (*)
5180: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
5190: 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63   void *);.static
51a0: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65   int walkExprTre
51b0: 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  e(Expr *pExpr, i
51c0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
51d0: 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  *,Expr*), void *
51e0: 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pArg){.  int rc;
51f0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
5200: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
5210: 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67   = (*xFunc)(pArg
5220: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
5230: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
5240: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45   walkExprTree(pE
5250: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e  xpr->pLeft, xFun
5260: 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72  c, pArg) ) retur
5270: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c  n 1;.    if( wal
5280: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d  kExprTree(pExpr-
5290: 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20  >pRight, xFunc, 
52a0: 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31  pArg) ) return 1
52b0: 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  ;.    if( walkEx
52c0: 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
52d0: 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ist, xFunc, pArg
52e0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
52f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b  }.  return rc>1;
5300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77  .}../*.** Call w
5310: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f  alkExprTree() fo
5320: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
5330: 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f  on in list p..*/
5340: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
5350: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
5360: 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e  t *p, int (*xFun
5370: 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  c)(void *, Expr*
5380: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
5390: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
53a0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
53b0: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70  *pItem;.  if( !p
53c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
53d0: 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70  or(i=p->nExpr, p
53e0: 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20  Item=p->a; i>0; 
53f0: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
5400: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
5410: 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ree(pItem->pExpr
5420: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
5430: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
5440: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5450: 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70  .** Call walkExp
5460: 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72  rTree() for ever
5470: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
5480: 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e  Select p, not in
5490: 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65  cluding.** expre
54a0: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
54b0: 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65  part of sub-sele
54c0: 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20  cts in any FROM 
54d0: 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49  clause or the LI
54e0: 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54  MIT.** or OFFSET
54f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a   expressions...*
5500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
5510: 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65  kSelectExpr(Sele
5520: 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  ct *p, int (*xFu
5530: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
5540: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
5550: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
5560: 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63  p->pEList, xFunc
5570: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
5580: 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72  xprTree(p->pWher
5590: 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  e, xFunc, pArg);
55a0: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
55b0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75  p->pGroupBy, xFu
55c0: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
55d0: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61  kExprTree(p->pHa
55e0: 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72  ving, xFunc, pAr
55f0: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69  g);.  walkExprLi
5600: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
5610: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
5620: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
5630: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5640: 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20   is designed as 
5650: 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
5660: 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a  kExprTree()..**.
5670: 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c  ** pArg is reall
5680: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
5690: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77  n integer.  If w
56a0: 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f  e can tell by lo
56b0: 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70  oking.** at pExp
56c0: 72 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  r that the expre
56d0: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
56e0: 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74  ins pExpr is not
56f0: 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65   a constant.** e
5700: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
5710: 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61  set *pArg to 0 a
5720: 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61  nd return 2 to a
5730: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
5740: 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70  walk..** If pExp
5750: 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20  r does does not 
5760: 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 20 65  disqualify the e
5770: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62  xpression from b
5780: 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a  eing a constant.
5790: 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  ** then do nothi
57a0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ng..**.** After 
57b0: 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c  walking the whol
57c0: 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f  e tree, if no no
57d0: 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68  des are found th
57e0: 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a  at disqualify.**
57f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5800: 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  as constant, the
5810: 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20  n we assume the 
5820: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
5830: 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  .** is constant.
5840: 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
5850: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f  rIsConstant() fo
5860: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
5870: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
5880: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
5890: 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20  IsConstant(void 
58a0: 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
58b0: 70 72 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  pr){.  switch( p
58c0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
58d0: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
58e0: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
58f0: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
5900: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
5910: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
5920: 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a  and *pArg==2 */.
5930: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
5940: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
5950: 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 3d 3d 32  *((int*)pArg)==2
5960: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
5970: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5980: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
5990: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
59a0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
59b0: 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63  se TK_DOT:.    c
59c0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
59d0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
59e0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66  _AGG_COLUMN:.#if
59f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5a00: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
5a10: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
5a20: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
5a30: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a  :.#endif.      *
5a40: 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30  ((int*)pArg) = 0
5a50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32  ;.      return 2
5a60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
5a70: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  :.      if( pExp
5a80: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
5a90: 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70 41        *((int*)pA
5aa0: 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rg) = 0;.       
5ab0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
5ac0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a   }.    default:.
5ad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
5ae0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c    }.}../*.** Wal
5af0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
5b00: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20  tree.  Return 1 
5b10: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
5b20: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
5b30: 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76   and 0 if it inv
5b40: 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20  olves variables 
5b50: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  or function call
5b60: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
5b70: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
5b80: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
5b90: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
5ba0: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
5bb0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
5bc0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
5bd0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
5be0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
5bf0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
5c00: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
5c10: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
5c20: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
5c30: 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20   isConst = 1;.  
5c40: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20  walkExprTree(p, 
5c50: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
5c60: 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20  nt, &isConst);. 
5c70: 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b   return isConst;
5c80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
5c90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
5ca0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
5cb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
5cc0: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72  s constant.** or
5cd0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
5ce0: 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61   with constant a
5cf0: 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
5d00: 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65  n and 0 if there
5d10: 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69  .** are any vari
5d20: 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ables..**.** For
5d30: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
5d40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
5d50: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
5d60: 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
5d70: 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
5d80: 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
5d90: 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
5da0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
5db0: 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
5dc0: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
5dd0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
5de0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45  tantOrFunction(E
5df0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  xpr *p){.  int i
5e00: 73 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77 61  sConst = 2;.  wa
5e10: 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65 78  lkExprTree(p, ex
5e20: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
5e30: 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72  , &isConst);.  r
5e40: 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30  eturn isConst!=0
5e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
5e60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
5e70: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
5e80: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
5e90: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
5ea0: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
5eb0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
5ec0: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
5ed0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
5ee0: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
5ef0: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
5f00: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
5f10: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
5f20: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
5f30: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
5f40: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
5f50: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
5f60: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
5f70: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
5f80: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
5f90: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
5fa0: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73  nt *pValue){.  s
5fb0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
5fc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
5fd0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  GER: {.      if(
5fe0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
5ff0: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
6000: 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20  .z, pValue) ){. 
6010: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
6020: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6030: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6040: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
6050: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
6060: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
6070: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
6080: 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lue);.    }.    
6090: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
60a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
60b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
60c0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
60d0: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
60e0: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
60f0: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74   -v;.        ret
6100: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6120: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
6130: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
6140: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
6150: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
6160: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
6170: 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
6180: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
6190: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
61a0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
61b0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
61c0: 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
61d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
61e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
61f0: 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
6200: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
6210: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6220: 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
6230: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
6240: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6250: 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d  ** Given the nam
6260: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  e of a column of
6270: 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20   the form X.Y.Z 
6280: 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a  or Y.Z or just Z
6290: 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61  , look up.** tha
62a0: 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65  t name in the se
62b0: 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c  t of source tabl
62c0: 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61  es in pSrcList a
62d0: 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70  nd make the pExp
62e0: 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  r .** expression
62f0: 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b   node refer back
6300: 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20   to that source 
6310: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c  column.  The fol
6320: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a  lowing changes.*
6330: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45  * are made to pE
6340: 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45  xpr:.**.**    pE
6350: 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20  xpr->iDb        
6360: 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65 78     Set the index
6370: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66   in db->aDb[] of
6380: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
6390: 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  lding.**        
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   the table..**  
63c0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
63d0: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
63e0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
63f0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62  for the table ob
6400: 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20  tained.**       
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e    from pSrcList.
6430: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .**    pExpr->iC
6440: 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20  olumn       Set 
6450: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  to the column nu
6460: 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65 20  mber within the 
6470: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
6480: 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
6490: 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55    Set to TK_COLU
64a0: 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  MN..**    pExpr-
64b0: 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20 41  >pLeft         A
64c0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
64d0: 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20  is points to is 
64e0: 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45  deleted.**    pE
64f0: 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20  xpr->pRight     
6500: 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f     Any expressio
6510: 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f  n this points to
6520: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
6530: 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20  ** The pDbToken 
6540: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
6550: 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68 65  he database (the
6560: 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c   "X").  This val
6570: 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c  ue may be.** NUL
6580: 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  L meaning that n
6590: 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ame is of the fo
65a0: 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e  rm Y.Z or Z.  An
65b0: 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61  y available data
65c0: 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75  base.** can be u
65d0: 73 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65  sed.  The pTable
65e0: 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d  Token is the nam
65f0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28  e of the table (
6600: 74 68 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a  the "Y").  This.
6610: 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  ** value can be 
6620: 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e  NULL if pDbToken
6630: 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20   is also NULL.  
6640: 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69  If pTableToken i
6650: 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61  s NULL it.** mea
6660: 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d  ns that the form
6670: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
6680: 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d  Z and that colum
6690: 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c  ns from any tabl
66a0: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  e.** can be used
66b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
66c0: 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  ame cannot be re
66d0: 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f  solved unambiguo
66e0: 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65  usly, leave an e
66f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
6700: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
6710: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  turn non-zero.  
6720: 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73  Return zero on s
6730: 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  uccess..*/.stati
6740: 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65  c int lookupName
6750: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6760: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
6770: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
6780: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54  */.  Token *pDbT
6790: 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  oken,     /* Nam
67a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
67b0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
67c0: 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  le, or NULL */. 
67d0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f   Token *pTableTo
67e0: 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ken,  /* Name of
67f0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
6800: 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c  g column, or NUL
6810: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  L */.  Token *pC
6820: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e  olumnToken, /* N
6830: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
6840: 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  n. */.  NameCont
6850: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20  ext *pNC,    /* 
6860: 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  The name context
6870: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
6880: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45   the name */.  E
6890: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
68a0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73      /* Make this
68b0: 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74   EXPR node point
68c0: 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64   to the selected
68d0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20   column */.){.  
68e0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20  char *zDb = 0;  
68f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6900: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
6910: 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20  he "X" in X.Y.Z 
6920: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20  */.  char *zTab 
6930: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
6940: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  e of the table. 
6950: 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e   The "Y" in X.Y.
6960: 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68  Z or Y.Z */.  ch
6970: 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20  ar *zCol = 0;   
6980: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6990: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22  e column.  The "
69a0: 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  Z" */.  int i, j
69b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
69c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
69d0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20  .  int cnt = 0; 
69e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
69f0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
6a00: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
6a10: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
6a20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6a30: 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  f matching table
6a40: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69   names */.  sqli
6a50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6a60: 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61  ->db;  /* The da
6a70: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75  tabase */.  stru
6a80: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
6a90: 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a  *pItem;       /*
6aa0: 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67   Use for looping
6ab0: 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 69   over pSrcList i
6ac0: 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  tems */.  struct
6ad0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
6ae0: 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54  Match = 0;  /* T
6af0: 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63  he matching pSrc
6b00: 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e  List item */.  N
6b10: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70  ameContext *pTop
6b20: 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20  NC = pNC;       
6b30: 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f   /* First nameco
6b40: 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73  ntext in the lis
6b50: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
6b60: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20  pColumnToken && 
6b70: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20  pColumnToken->z 
6b80: 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58  ); /* The Z in X
6b90: 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e  .Y.Z cannot be N
6ba0: 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73  ULL */.  zDb = s
6bb0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6bc0: 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20  ken(pDbToken);. 
6bd0: 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e   zTab = sqlite3N
6be0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
6bf0: 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f  bleToken);.  zCo
6c00: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
6c10: 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e  romToken(pColumn
6c20: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71  Token);.  if( sq
6c30: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
6c40: 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  d() ){.    goto 
6c50: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a  lookupname_end;.
6c60: 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54    }..  pExpr->iT
6c70: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69  able = -1;.  whi
6c80: 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d  le( pNC && cnt==
6c90: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
6ca0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
6cb0: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
6cc0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
6cd0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c  ;..    if( pSrcL
6ce0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ist ){.      for
6cf0: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
6d00: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c  List->a; i<pSrcL
6d10: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
6d20: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
6d30: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
6d40: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
6d50: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a          Column *
6d60: 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20  pCol;.  .       
6d70: 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
6d80: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tab;.        ass
6d90: 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
6da0: 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
6db0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
6dc0: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
6dd0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 61  hema);.        a
6de0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
6df0: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
6e00: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
6e10: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
6e20: 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
6e30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
6e40: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
6e50: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
6e60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6e70: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
6e80: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
6e90: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ue;.          }e
6ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
6eb0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
6ec0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
6ed0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
6ee0: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  TabName==0 || sq
6ef0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
6f00: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
6f10: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6f20: 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21          if( zDb!
6f30: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
6f40: 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62  ICmp(db->aDb[iDb
6f50: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  ].zName, zDb)!=0
6f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f70: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
6f80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6fa0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
6fb0: 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20  cntTab++) ){.   
6fc0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
6fd0: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
6fe0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ursor;.         
6ff0: 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20   pExpr->pSchema 
7000: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
7010: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
7020: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
7030: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
7040: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
7050: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
7060: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
7070: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
7080: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7090: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
70a0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
70b0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
70c0: 2a 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  *zColl = pTab->a
70d0: 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
70e0: 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74            IdList
70f0: 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20   *pUsing;.      
7100: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
7110: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7120: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
7130: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
7140: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
7150: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tem;.           
7160: 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61 20   pExpr->pSchema 
7170: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
7180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
7190: 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72  Substitute the r
71a0: 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29  owid (column -1)
71b0: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
71c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
71e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d  r->iColumn = j==
71f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31  pTab->iPKey ? -1
7200: 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   : j;.          
7210: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
7220: 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  y = pTab->aCol[j
7230: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
7240: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45 78          if( (pEx
7250: 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  pr->flags & EP_E
7260: 78 70 43 6f 6c 6c 61 74 65 29 3d 3d 30 20 29 7b  xpCollate)==0 ){
7270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
7280: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
7290: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
72a0: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
72b0: 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20  oll,-1, 0);.    
72c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
72d0: 20 20 20 20 20 20 69 66 28 20 69 3c 70 53 72 63        if( i<pSrc
72e0: 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a  List->nSrc-1 ){.
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7300: 28 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74  ( pItem[1].joint
7310: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
7320: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7330: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d      /* If this m
7340: 61 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e  atch occurred in
7350: 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20   the left table 
7360: 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69  of a natural joi
7370: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
7380: 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20     ** then skip 
7390: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
73a0: 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69  to avoid a dupli
73b0: 63 61 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20  cate match */.  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
73d0: 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  tem++;.         
73e0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
73f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
7400: 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49  if( (pUsing = pI
7410: 74 65 6d 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d  tem[1].pUsing)!=
7420: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7430: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
7440: 6d 61 74 63 68 20 6f 63 63 75 72 73 20 6f 6e 20  match occurs on 
7450: 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73  a column that is
7460: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
7470: 61 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  ause.           
7480: 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69       ** of a joi
7490: 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65 61 72  n, skip the sear
74a0: 63 68 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ch of the right 
74b0: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
74c0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
74d0: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20    ** to avoid a 
74e0: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
74f0: 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20  there. */.      
7500: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
7510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7520: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69   for(k=0; k<pUsi
7530: 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20  ng->nId; k++){. 
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
7560: 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d  Cmp(pUsing->a[k]
7570: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
7580: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7590: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b          pItem++;
75a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
75b0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
75d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
75e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
75f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7600: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7640: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7650: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7660: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
7670: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e   /* If we have n
7680: 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c  ot already resol
7690: 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68  ved the name, th
76a0: 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a  en maybe .    **
76b0: 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f   it is a new.* o
76c0: 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20  r old.* trigger 
76d0: 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e  argument referen
76e0: 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ce.    */.    if
76f0: 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62  ( zDb==0 && zTab
7700: 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26  !=0 && cnt==0 &&
7710: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
7720: 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ck!=0 ){.      T
7730: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72  riggerStack *pTr
7740: 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61  iggerStack = pPa
7750: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
7760: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7770: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
7780: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
7790: 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20  newIdx != -1 && 
77a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
77b0: 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30  new", zTab) == 0
77c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
77d0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
77e0: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
77f0: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
7800: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
7810: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
7820: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
7830: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
7840: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
7850: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
7860: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
7870: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64  ite3StrICmp("old
7880: 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20  ", zTab)==0 ){. 
7890: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
78a0: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
78b0: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20  tack->oldIdx;.  
78c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
78d0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
78e0: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  b );.        pTa
78f0: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
7900: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d  k->pTab;.      }
7910: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
7920: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74   ){ .        int
7930: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43   iCol;.        C
7940: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54  olumn *pCol = pT
7950: 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20  ab->aCol;..     
7960: 20 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d     pExpr->pSchem
7970: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
7980: 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61  a;.        cntTa
7990: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  b++;.        for
79a0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20  (iCol=0; iCol < 
79b0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
79c0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
79d0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
79e0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
79f0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
7a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
7a20: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
7a30: 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col].zColl;.    
7a40: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
7a50: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7a60: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
7a70: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
7a80: 2d 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20  -1 : iCol;.     
7a90: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
7aa0: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
7ab0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
7ac0: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
7ad0: 69 66 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67  if( (pExpr->flag
7ae0: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
7af0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
7b00: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
7b10: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
7b20: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
7b30: 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 2d 31 2c 20  (db), zColl,-1, 
7b40: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
7b50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  }.            pE
7b60: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  xpr->pTab = pTab
7b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
7b80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
7b90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7ba0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
7bb0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
7bc0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
7bd0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
7be0: 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
7bf0: 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e  ame is a referen
7c00: 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a  ce to the ROWID.
7c10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
7c20: 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d  nt==0 && cntTab=
7c30: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52  =1 && sqlite3IsR
7c40: 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20  owid(zCol) ){.  
7c50: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
7c60: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7c70: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45  n = -1;.      pE
7c80: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
7c90: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
7ca0: 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ER;.    }..    /
7cb0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
7cc0: 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20  input is of the 
7cd0: 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20  form Z (not Y.Z 
7ce0: 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74  or X.Y.Z) then t
7cf0: 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a  he name Z.    **
7d00: 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20   might refer to 
7d10: 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c  an result-set al
7d20: 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65  ias.  This happe
7d30: 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
7d40: 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   when.    ** we 
7d50: 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61  are resolving na
7d60: 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  mes in the WHERE
7d70: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
7d80: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64  ollowing command
7d90: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
7da0: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
7db0: 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57  S x FROM table W
7dc0: 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a  HERE x<10;.    *
7dd0: 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65  *.    ** In case
7de0: 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70  s like this, rep
7df0: 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20  lace pExpr with 
7e00: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
7e10: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20  pression that.  
7e20: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
7e30: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
7e40: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
7e50: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
7e60: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
7e70: 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
7e80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
7e90: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7ea0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
7eb0: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a  eady been.    **
7ec0: 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65   resolved by the
7ed0: 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20   time the WHERE 
7ee0: 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76  clause is resolv
7ef0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
7f00: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45  f( cnt==0 && (pE
7f10: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
7f20: 73 74 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d  st)!=0 && zTab==
7f30: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
7f40: 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; j<pEList->nE
7f50: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
7f60: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
7f70: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
7f80: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e;.        if( z
7f90: 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  As!=0 && sqlite3
7fa0: 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f  StrICmp(zAs, zCo
7fb0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
7fc0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
7fd0: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
7fe0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
7ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
8000: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20  r->op = TK_AS;. 
8010: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
8020: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  iColumn = j;.   
8030: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
8040: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
8050: 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a  rDup(pEList->a[j
8060: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
8070: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
8080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
8090: 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30  Tab==0 && zDb==0
80a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   );.          go
80b0: 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  to lookupname_en
80c0: 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d_2;.        }. 
80d0: 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20       } .    }.. 
80e0: 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f     /* Advance to
80f0: 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63   the next name c
8100: 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f  ontext.  The loo
8110: 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e  p will exit when
8120: 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77   either.    ** w
8130: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28  e have a match (
8140: 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77  cnt>0) or when w
8150: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d  e run out of nam
8160: 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20  e contexts..    
8170: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
8180: 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d  0 ){.      pNC =
8190: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
81a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
81b0: 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65  * If X and Y are
81c0: 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20   NULL (in other 
81d0: 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68  words if only th
81e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20  e column name Z 
81f0: 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64  is.  ** supplied
8200: 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ) and the value 
8210: 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64  of Z is enclosed
8220: 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65   in double-quote
8230: 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69  s, then.  ** Z i
8240: 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  s a string liter
8250: 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  al if it doesn't
8260: 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d   match any colum
8270: 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61  n names.  In tha
8280: 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20  t.  ** case, we 
8290: 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72  need to return r
82a0: 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f  ight away and no
82b0: 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  t make any chang
82c0: 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72  es to.  ** pExpr
82d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61  ..  **.  ** Beca
82e0: 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65  use no reference
82f0: 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74   was made to out
8300: 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65  er contexts, the
8310: 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20   pNC->nRef.  ** 
8320: 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63  fields are not c
8330: 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f  hanged in any co
8340: 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ntext..  */.  if
8350: 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62  ( cnt==0 && zTab
8360: 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ==0 && pColumnTo
8370: 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29  ken->z[0]=='"' )
8380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
8390: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75  (zCol);.    retu
83a0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rn 0;.  }..  /*.
83b0: 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e    ** cnt==0 mean
83c0: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  s there was not 
83d0: 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65  match.  cnt>1 me
83e0: 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74  ans there were t
83f0: 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20  wo or.  ** more 
8400: 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72  matches.  Either
8410: 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e   way, we have an
8420: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69   error..  */.  i
8430: 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20  f( cnt!=1 ){.   
8440: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
8450: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
8460: 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20    zErr = cnt==0 
8470: 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  ? "no such colum
8480: 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75  n: %s" : "ambigu
8490: 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ous column name:
84a0: 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44   %s";.    if( zD
84b0: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
84c0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20  e3SetString(&z, 
84d0: 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20  zDb, ".", zTab, 
84e0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
84f0: 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  *)0);.    }else 
8500: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
8510: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
8520: 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22  ng(&z, zTab, "."
8530: 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30  , zCol, (char*)0
8540: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8550: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74      z = sqliteSt
8560: 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  rDup(zCol);.    
8570: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
8580: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45  orMsg(pParse, zE
8590: 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  rr, z);.    sqli
85a0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70  teFree(z);.    p
85b0: 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  TopNC->nErr++;. 
85c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f   }..  /* If a co
85d0: 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c  lumn from a tabl
85e0: 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73  e in pSrcList is
85f0: 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65   referenced, the
8600: 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68  n record.  ** th
8610: 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70  is fact in the p
8620: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55  SrcList.a[].colU
8630: 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f  sed bitmask.  Co
8640: 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20  lumn 0 causes.  
8650: 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73  ** bit 0 to be s
8660: 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65  et.  Column 1 se
8670: 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73  ts bit 1.  And s
8680: 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65  o forth.  If the
8690: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d  .  ** column num
86a0: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
86b0: 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  han the number o
86c0: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69  f bits in the bi
86d0: 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20  tmask.  ** then 
86e0: 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64  set the high-ord
86f0: 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69  er bit of the bi
8700: 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  tmask..  */.  if
8710: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
8720: 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30  >=0 && pMatch!=0
8730: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
8740: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
8750: 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f      if( n>=sizeo
8760: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a  f(Bitmask)*8 ){.
8770: 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66        n = sizeof
8780: 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20  (Bitmask)*8-1;. 
8790: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
87a0: 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72   pMatch->iCursor
87b0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
87c0: 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63  );.    pMatch->c
87d0: 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d  olUsed |= ((Bitm
87e0: 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a  ask)1)<<n;.  }..
87f0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a  lookupname_end:.
8800: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
8810: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
8820: 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b  sqliteFree(zDb);
8830: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
8840: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ab);.  sqlite3Ex
8850: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
8860: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
8870: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
8880: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8890: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
88a0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
88b0: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
88c0: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f   = TK_COLUMN;.lo
88d0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a  okupname_end_2:.
88e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
88f0: 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31  l);.  if( cnt==1
8900: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8910: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  pNC!=0 );.    sq
8920: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
8930: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43  arse, pExpr, pNC
8940: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
8950: 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21   if( pMatch && !
8960: 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20  pMatch->pSelect 
8970: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
8980: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
8990: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  Tab;.    }.    /
89a0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
89b0: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
89c0: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
89d0: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
89e0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
89f0: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
8a00: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
8a10: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
8a20: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
8a30: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
8a40: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
8a50: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
8a60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8a70: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
8a80: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
8a90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
8aa0: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
8ab0: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
8ac0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8ad0: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
8ae0: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
8af0: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
8b00: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
8b10: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
8b20: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
8b30: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
8b40: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
8b50: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
8b60: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
8b70: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
8b80: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
8b90: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
8ba0: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
8bb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8bc0: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
8bd0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
8be0: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
8bf0: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
8c00: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
8c10: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
8c20: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
8c30: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
8c40: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
8c50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
8c60: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
8c70: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
8c80: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
8c90: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
8ca0: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
8cb0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8cc0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
8cd0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
8ce0: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
8cf0: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
8d00: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
8d10: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
8d20: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
8d30: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
8d40: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
8d50: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
8d60: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
8d70: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
8d80: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
8d90: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
8da0: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
8db0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
8dc0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
8dd0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
8de0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
8df0: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
8e00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
8e10: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
8e20: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
8e30: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
8e40: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
8e50: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
8e60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
8e70: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8e80: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
8e90: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
8ea0: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
8eb0: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
8ec0: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
8ed0: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
8ee0: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
8ef0: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
8f00: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
8f10: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
8f20: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
8f30: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
8f40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
8f50: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
8f60: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
8f70: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
8f80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
8f90: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
8fa0: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
8fb0: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
8fc0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
8fd0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
8fe0: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
8ff0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
9000: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
9010: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
9020: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
9030: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
9040: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
9050: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
9060: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9070: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
9080: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
9090: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
90a0: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
90b0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
90c0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
90d0: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
90e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
90f0: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
9100: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
9110: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
9120: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
9130: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
9140: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
9150: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
9160: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
9170: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
9180: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
9190: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
91a0: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
91b0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
91c0: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
91d0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
91e0: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
91f0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
9200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
9220: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
9230: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
9240: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
9250: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
9260: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
9270: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
9280: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
9290: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
92a0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
92b0: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
92c0: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
92d0: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
92e0: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
92f0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9300: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
9310: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
9320: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
9330: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
9340: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
9350: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
9360: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
9370: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
9380: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
9390: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
93a0: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
93b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
93c0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
93d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
93e0: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
93f0: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
9400: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
9410: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
9420: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
9430: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
9440: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
9450: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
9460: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9470: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
9480: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9490: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
94a0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
94b0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
94c0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
94d0: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
94e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f          /* Autho
94f0: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20  rization to use 
9500: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
9510: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9540: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
9550: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
9560: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9570: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
9580: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
9590: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
95a0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
95b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
95c0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
95d0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
95e0: 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20        int enc = 
95f0: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
9600: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
9610: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20  e encoding */.. 
9620: 20 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72       zId = (char
9630: 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
9640: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45  ;.      nId = pE
9650: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
9660: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
9670: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
9680: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
9690: 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b  nId, n, enc, 0);
96a0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
96b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
96c0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
96d0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
96e0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
96f0: 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  1, enc, 0);.    
9700: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
9710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
9720: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
9730: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9740: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
9750: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
9760: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
9770: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
9780: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
9790: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  =0;.      }.#ifn
97a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
97b0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
97c0: 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a      if( pDef ){.
97d0: 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73          auth = s
97e0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
97f0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46  pParse, SQLITE_F
9800: 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66  UNCTION, 0, pDef
9810: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
9820: 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53       if( auth!=S
9830: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9840: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d        if( auth==
9850: 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20  SQLITE_DENY ){. 
9860: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9870: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9880: 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a  e, "not authoriz
9890: 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  ed to use functi
98a0: 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  on: %s",.       
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
98d0: 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  f->zName);.     
98e0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
98f0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
9900: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
9910: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
9920: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9930: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
9940: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9950: 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20    if( is_agg && 
9960: 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29  !pNC->allowAgg )
9970: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9980: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9990: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
99a0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
99b0: 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64  %.*s()", nId,zId
99c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
99d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
99e0: 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20  is_agg = 0;.    
99f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73    }else if( no_s
9a00: 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20  uch_func ){.    
9a10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9a20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
9a30: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25  such function: %
9a40: 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  .*s", nId, zId);
9a50: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
9a60: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
9a70: 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f  e if( wrong_num_
9a80: 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  args ){.        
9a90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9aa0: 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75  pParse,"wrong nu
9ab0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9ac0: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e  s to function %.
9ad0: 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20  *s()",.         
9ae0: 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20      nId, zId);. 
9af0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
9b00: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
9b10: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
9b20: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
9b30: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
9b40: 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  ION;.        pNC
9b50: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
9b60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9b70: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
9b80: 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  lowAgg = 0;.    
9b90: 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e    for(i=0; pNC->
9ba0: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
9bb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61  i++){.        wa
9bc0: 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74  lkExprTree(pList
9bd0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61  ->a[i].pExpr, na
9be0: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
9bf0: 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNC);.      }.  
9c00: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
9c10: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
9c20: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58   1;.      /* FIX
9c30: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
9c40: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
9c50: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
9c60: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
9c70: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
9c80: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
9c90: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
9ca0: 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69  is_agg;.    }.#i
9cb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9cc0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
9cd0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
9ce0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
9cf0: 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  S:.#endif.    ca
9d00: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
9d10: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
9d20: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
9d30: 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e  int nRef = pNC->
9d40: 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51  nRef;.#ifndef SQ
9d50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
9d60: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
9d70: 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  >isCheck ){.    
9d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9d90: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75  orMsg(pParse,"su
9da0: 62 71 75 65 72 69 65 73 20 70 72 6f 68 69 62 69  bqueries prohibi
9db0: 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e  ted in CHECK con
9dc0: 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
9dd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
9de0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
9df0: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
9e00: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
9e10: 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20  , pNC);.        
9e20: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
9e30: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
9e40: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
9e50: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
9e60: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
9e70: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
9e80: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
9e90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9ea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9eb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9ec0: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73  IT_CHECK.    cas
9ed0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
9ee0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
9ef0: 69 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20  isCheck ){.     
9f00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9f10: 73 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d  sg(pParse,"param
9f20: 65 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64  eters prohibited
9f30: 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   in CHECK constr
9f40: 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d  aints");.      }
9f50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9f60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
9f70: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
9f80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9f90: 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73   walks an expres
9fa0: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65  sion tree and re
9fb0: 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65  solves reference
9fc0: 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f  s to.** table co
9fd0: 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66  lumns.  Nodes of
9fe0: 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20   the form ID.ID 
9ff0: 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e  or ID resolve in
a000: 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74  to an.** index t
a010: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
a020: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e  he table list an
a030: 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65  d a column offse
a040: 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72  t.  The .** Expr
a050: 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68  .opcode for such
a060: 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65   nodes is change
a070: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20  d to TK_COLUMN. 
a080: 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65   The Expr.iTable
a090: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61  .** value is cha
a0a0: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
a0b0: 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  x of the referen
a0c0: 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61  ced table in pTa
a0d0: 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68  bList.** plus th
a0e0: 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20  e "base" value. 
a0f0: 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20   The base value 
a100: 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
a110: 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44  become the.** VD
a120: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
a130: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
a140: 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69  at is pointing i
a150: 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63  nto the referenc
a160: 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ed.** table.  Th
a170: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
a180: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
a190: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
a1a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f  the column .** o
a1b0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
a1c0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
a1d0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
a1e0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a  for the special.
a1f0: 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  ** ROWID column 
a200: 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45  is -1.  Any INTE
a210: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
a220: 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20  column is tried 
a230: 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66  as an.** alias f
a240: 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20  or ROWID..**.** 
a250: 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e  Also resolve fun
a260: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20  ction names and 
a270: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
a280: 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a  ons for proper.*
a290: 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73  * usage.  Make s
a2a0: 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ure all function
a2b0: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
a2c0: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
a2d0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20  nctions.** have 
a2e0: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
a2f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
a300: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
a310: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
a320: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69  Parse->zErrMsg i
a330: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
a340: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
a350: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
a360: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
a370: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
a380: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
a390: 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74  nctions then set
a3a0: 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70   the EP_Agg.** p
a3b0: 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65  roperty on the e
a3c0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e  xpression..*/.in
a3d0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  t sqlite3ExprRes
a3e0: 6f 6c 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d  olveNames(.  Nam
a3f0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
a400: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63       /* Namespac
a410: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70  e to resolve exp
a420: 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a  ressions in. */.
a430: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
a440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a450: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
a460: 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29  e analyzed. */.)
a470: 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48 61 73  {.  int savedHas
a480: 41 67 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72  Agg;.  if( pExpr
a490: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
a4a0: 20 20 73 61 76 65 64 48 61 73 41 67 67 20 3d 20    savedHasAgg = 
a4b0: 70 4e 43 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70  pNC->hasAgg;.  p
a4c0: 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a  NC->hasAgg = 0;.
a4d0: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
a4e0: 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76  Expr, nameResolv
a4f0: 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20  erStep, pNC);.  
a500: 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20  if( pNC->nErr>0 
a510: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
a520: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
a530: 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  _Error);.  }.  i
a540: 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 29  f( pNC->hasAgg )
a550: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
a560: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a570: 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Agg);.  }else if
a580: 28 20 73 61 76 65 64 48 61 73 41 67 67 20 29 7b  ( savedHasAgg ){
a590: 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67  .    pNC->hasAgg
a5a0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
a5b0: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
a5c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
a5d0: 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  or);.}../*.** A 
a5e0: 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65  pointer instance
a5f0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
a600: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 70 61  re is used to pa
a610: 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ss information.*
a620: 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78  * through walkEx
a630: 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65  prTree into code
a640: 53 75 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a  SubqueryStep()..
a650: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
a660: 74 20 51 75 65 72 79 43 6f 64 65 72 20 51 75 65  t QueryCoder Que
a670: 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20  ryCoder;.struct 
a680: 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50  QueryCoder {.  P
a690: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
a6a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
a6b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a6c0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
a6d0: 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63  ;    /* Namespac
a6e0: 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f  e of first enclo
a6f0: 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b  sing query */.};
a700: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
a710: 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
a720: 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
a730: 64 20 61 73 20 61 6e 20 65 78 70 72 65 73 73 69  d as an expressi
a740: 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65  on.** and IN ope
a750: 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
a760: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
a770: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
a780: 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
a790: 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
a7a0: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
a7b0: 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
a7c0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
a7d0: 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
a7e0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
a7f0: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
a800: 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
a810: 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
a820: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
a830: 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
a840: 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
a850: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
a860: 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
a870: 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
a880: 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
a890: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
a8a0: 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
a8b0: 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
a8c0: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
a8d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a8e0: 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ERY.void sqlite3
a8f0: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50 61  CodeSubselect(Pa
a900: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
a910: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
a920: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20   testAddr = 0;  
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a940: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
a950: 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
a960: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
a970: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
a980: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
a990: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
a9a0: 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62  This code must b
a9b0: 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74  e run in its ent
a9c0: 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65  irety every time
a9d0: 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
a9e0: 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f  ed.  ** if any o
a9f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
aa00: 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
aa10: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
aa20: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
aa30: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
aa40: 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
aa50: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
aa60: 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
aa70: 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
aa80: 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
aa90: 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
aaa0: 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
aab0: 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
aac0: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
aad0: 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
aae0: 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
aaf0: 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
ab00: 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
ab10: 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
ab20: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
ab30: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
ab40: 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
ab50: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 41  .  if( !ExprHasA
ab60: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
ab70: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
ab80: 26 26 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67  && !pParse->trig
ab90: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  Stack ){.    int
aba0: 20 6d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e   mem = pParse->n
abb0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Mem++;.    sqlit
abc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
abd0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20  P_MemLoad, mem, 
abe0: 30 29 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72  0);.    testAddr
abf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ac00: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c  dOp(v, OP_If, 0,
ac10: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
ac20: 20 74 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 73   testAddr>0 || s
ac30: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
ac40: 65 64 28 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ed() );.    sqli
ac50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ac60: 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d 65  OP_MemInt, 1, me
ac70: 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  m);.  }..  switc
ac80: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
ac90: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
aca0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
acb0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79  inity;.      Key
acc0: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
acd0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
ace0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
acf0: 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
ad00: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
ad10: 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69  */..      affini
ad20: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
ad30: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
ad40: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pLeft);..      /
ad50: 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
ad60: 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
ad70: 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
ad80: 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
ad90: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
ada0: 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
adb0: 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
adc0: 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
add0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
ade0: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
adf0: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
ae00: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
ae10: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
ae20: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
ae30: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
ae40: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
ae50: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
ae60: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
ae70: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
ae80: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
ae90: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
aea0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
aeb0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
aec0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
aed0: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
aee0: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
aef0: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
af00: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
af10: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
af20: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
af30: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
af40: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
af50: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
af60: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
af70: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
af80: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
af90: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
afa0: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
afb0: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
afc0: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
afd0: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
afe0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
aff0: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
b000: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
b010: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
b020: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
b030: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
b040: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
b050: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  ddOp(v, OP_OpenE
b060: 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d  phemeral, pExpr-
b070: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
b080: 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e     memset(&keyIn
b090: 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  fo, 0, sizeof(ke
b0a0: 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b  yInfo));.      k
b0b0: 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20  eyInfo.nField = 
b0c0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
b0d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b0e0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70  SetNumColumns, p
b0f0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29  Expr->iTable, 1)
b100: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ;..      if( pEx
b110: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
b120: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
b130: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
b140: 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
b150: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
b160: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b170: 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
b180: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
b190: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
b1a0: 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
b1b0: 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
b1c0: 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
b1d0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
b1e0: 20 20 20 20 20 69 6e 74 20 69 50 61 72 6d 20 3d       int iParm =
b1f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b   pExpr->iTable +
b200: 20 20 28 28 28 69 6e 74 29 61 66 66 69 6e 69 74    (((int)affinit
b210: 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20  y)<<16);.       
b220: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b230: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
b240: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
b250: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
b260: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
b270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
b280: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
b290: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  xpr->pSelect, SR
b2a0: 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c  T_Set, iParm, 0,
b2b0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
b2c0: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
b2d0: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
b2e0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
b2f0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
b300: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20  ->nExpr>0 ){ .  
b310: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
b320: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72  aColl[0] = binar
b330: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
b340: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b350: 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
b360: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d      pEList->a[0]
b370: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
b380: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
b390: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  f( pExpr->pList 
b3a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
b3b0: 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
b3c0: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
b3d0: 20 20 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20       **..** For 
b3e0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
b3f0: 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
b400: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
b410: 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
b420: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
b430: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
b440: 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
b450: 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
b460: 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
b470: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
b480: 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
b490: 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
b4a0: 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
b4b0: 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
b4c0: 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
b4d0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
b4e0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b4f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
b500: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
b510: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
b520: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
b530: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
b540: 49 74 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69  Item;..        i
b550: 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
b560: 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
b570: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
b580: 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
b590: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
b5a0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72  aColl[0] = pExpr
b5b0: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  ->pLeft->pColl;.
b5c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
b5d0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
b5e0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
b5f0: 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
b600: 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
b610: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
b620: 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
b630: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
b640: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
b650: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a   pItem->pExpr;..
b660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
b670: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
b680: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
b690: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
b6a0: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
b6b0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
b6c0: 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
b6d0: 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
b6e0: 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
b6f0: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
b700: 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
b710: 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
b720: 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
b730: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
b740: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
b750: 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
b760: 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
b770: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
b780: 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41         if( testA
b790: 64 64 72 3e 30 20 26 26 20 21 73 71 6c 69 74 65  ddr>0 && !sqlite
b7a0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
b7b0: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
b7c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b7d0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 74  hangeToNoop(v, t
b7e0: 65 73 74 41 64 64 72 2d 31 2c 20 33 29 3b 0a 20  estAddr-1, 3);. 
b7f0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41             testA
b800: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ddr = 0;.       
b810: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
b820: 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
b830: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69  expression and i
b840: 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
b850: 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  e temp table */.
b860: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b870: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b880: 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20  , pE2);.        
b890: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
b8a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b8b0: 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  d, 1, 0, &affini
b8c0: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
b8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b8e0: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
b8f0: 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
b900: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 0);.        }
b910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b920: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b930: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P3(v, addr, (voi
b940: 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33  d *)&keyInfo, P3
b950: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
b960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
b970: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
b980: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
b990: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
b9a0: 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
b9b0: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
b9c0: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
b9d0: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
b9e0: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
b9f0: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
ba00: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
ba10: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
ba20: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
ba30: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
ba40: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
ba50: 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
ba60: 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d  onst Token one =
ba70: 20 7b 20 28 75 38 2a 29 22 31 22 2c 20 30 2c 20   { (u8*)"1", 0, 
ba80: 31 20 7d 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  1 };.      Selec
ba90: 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 20 20 69  t *pSel;.      i
baa0: 6e 74 20 69 4d 65 6d 3b 0a 20 20 20 20 20 20 69  nt iMem;.      i
bab0: 6e 74 20 73 6f 70 3b 0a 0a 20 20 20 20 20 20 70  nt sop;..      p
bac0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
bad0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
bae0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65  Mem++;.      pSe
baf0: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  l = pExpr->pSele
bb00: 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ct;.      if( pE
bb10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
bb20: 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f  CT ){.        so
bb30: 70 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  p = SRT_Mem;.   
bb40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bb50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e  AddOp(v, OP_MemN
bb60: 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20  ull, iMem, 0);. 
bb70: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
bb80: 6e 74 28 28 76 2c 20 22 23 20 49 6e 69 74 20 73  nt((v, "# Init s
bb90: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
bba0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
bbb0: 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52          sop = SR
bbc0: 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20  T_Exists;.      
bbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bbe0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
bbf0: 20 30 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20   0, iMem);.     
bc00: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
bc10: 76 2c 20 22 23 20 49 6e 69 74 20 45 58 49 53 54  v, "# Init EXIST
bc20: 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
bc30: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
bc40: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 53 65  e3ExprDelete(pSe
bc50: 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
bc60: 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
bc70: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
bc80: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26  INTEGER, 0, 0, &
bc90: 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  one);.      sqli
bca0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
bcb0: 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 69 4d 65  , pSel, sop, iMe
bcc0: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  m, 0, 0, 0, 0);.
bcd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bce0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 74 65   }.  }..  if( te
bcf0: 73 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71  stAddr ){.    sq
bd00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
bd10: 65 28 76 2c 20 74 65 73 74 41 64 64 72 29 3b 0a  e(v, testAddr);.
bd20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
bd30: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bd40: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
bd50: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
bd60: 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
bd70: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
bd80: 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
bd90: 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
bda0: 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20  [0..n-1] on the 
bdb0: 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  stack..*/.static
bdc0: 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
bdd0: 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  r(Vdbe *v, const
bde0: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
bdf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
be00: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
be10: 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 73  (z, &i) ){.    s
be20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
be30: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
be40: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
be50: 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36  ( sqlite3FitsIn6
be60: 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20 20  4Bits(z) ){.    
be70: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
be80: 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 30  , OP_Int64, 0, 0
be90: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  , z, n);.  }else
bea0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
beb0: 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  eOp3(v, OP_Real,
bec0: 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20   0, 0, z, n);.  
bed0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  }.}.../*.** Gene
bee0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
bef0: 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
bf00: 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
bf10: 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
bf20: 70 54 61 62 20 61 6e 64 20 70 75 73 68 20 74 68  pTab and push th
bf30: 61 74 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  at column value 
bf40: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  on the stack.  T
bf50: 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 6f 70  here.** is an op
bf60: 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61  en cursor to pTa
bf70: 62 20 69 6e 20 69 54 61 62 6c 65 2e 20 20 49 66  b in iTable.  If
bf80: 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 0a   iColumn<0 then.
bf90: 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  ** code is gener
bfa0: 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63  ated that extrac
bfb0: 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f  ts the rowid..*/
bfc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
bfd0: 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 56  rCodeGetColumn(V
bfe0: 64 62 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70  dbe *v, Table *p
bff0: 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  Tab, int iColumn
c000: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
c010: 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29   if( iColumn<0 )
c020: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28  {.    int op = (
c030: 70 54 61 62 20 26 26 20 49 73 56 69 72 74 75 61  pTab && IsVirtua
c040: 6c 28 70 54 61 62 29 29 20 3f 20 4f 50 5f 56 52  l(pTab)) ? OP_VR
c050: 6f 77 69 64 20 3a 20 4f 50 5f 52 6f 77 69 64 3b  owid : OP_Rowid;
c060: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c070: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69 54 61  AddOp(v, op, iTa
c080: 62 6c 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ble, 0);.  }else
c090: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
c0a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c0b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
c0c0: 6e 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  n, iTable, iColu
c0d0: 6d 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mn);.  }else{.  
c0e0: 20 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72    int op = IsVir
c0f0: 74 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f  tual(pTab) ? OP_
c100: 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c  VColumn : OP_Col
c110: 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
c120: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
c130: 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
c140: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
c150: 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70  lumnDefault(v, p
c160: 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 29 3b 0a 23  Tab, iColumn);.#
c170: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c180: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
c190: 54 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  T.    if( pTab->
c1a0: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
c1b0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c1c0: 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20  FF_REAL ){.     
c1d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c1e0: 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69  p(v, OP_RealAffi
c1f0: 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  nity, 0, 0);.   
c200: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
c210: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c220: 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
c230: 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
c240: 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
c250: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
c260: 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65 73  nd leave the res
c270: 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  ult on the top o
c280: 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  f stack..**.** T
c290: 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
c2a0: 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
c2b0: 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
c2c0: 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
c2d0: 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
c2e0: 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
c2f0: 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
c300: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
c310: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
c320: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
c330: 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
c340: 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
c350: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
c360: 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
c370: 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
c380: 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
c390: 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
c3a0: 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
c3b0: 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
c3c0: 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
c3d0: 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
c3e0: 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
c3f0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
c400: 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
c410: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
c420: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
c430: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
c440: 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 63 6b   op;.  int stack
c450: 43 68 6e 67 20 3d 20 31 3b 20 20 20 20 2f 2a 20  Chng = 1;    /* 
c460: 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61 6e 67 65  Amount of change
c470: 20 74 6f 20 73 74 61 63 6b 20 64 65 70 74 68 20   to stack depth 
c480: 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  */..  if( v==0 )
c490: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
c4a0: 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Expr==0 ){.    s
c4b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c4c0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
c4d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c4e0: 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d   }.  op = pExpr-
c4f0: 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
c500: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
c510: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
c520: 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
c530: 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
c540: 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
c550: 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
c560: 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
c570: 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
c580: 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
c590: 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
c5a0: 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
c5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c5c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
c5d0: 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20  ad, pCol->iMem, 
c5e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
c5f0: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
c600: 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
c610: 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
c620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c630: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
c640: 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
c650: 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
c680: 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20  SorterColumn);. 
c690: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c6a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
c6b0: 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
c6c0: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
c6d0: 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
c6e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c6f0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
c700: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
c710: 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
c720: 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
c730: 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67  pens when coding
c740: 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e   check constrain
c750: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
c760: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
c770: 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20 20 20  Offset>0 );.    
c780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c790: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
c7a0: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
c7b0: 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  -pExpr->iColumn-
c7c0: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1, 1);.      }el
c7d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
c7e0: 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
c7f0: 6c 75 6d 6e 28 76 2c 20 70 45 78 70 72 2d 3e 70  lumn(v, pExpr->p
c800: 54 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  Tab, pExpr->iCol
c810: 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
c820: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
c830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c840: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
c850: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
c860: 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68 61  eInteger(v, (cha
c870: 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
c880: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
c890: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
c8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c8b0: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
c8c0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
c8d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c8e0: 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c 20  _FLOAT==OP_Real 
c8f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c900: 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f 53   TK_STRING==OP_S
c910: 74 72 69 6e 67 38 20 29 3b 0a 20 20 20 20 20 20  tring8 );.      
c920: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78  sqlite3DequoteEx
c930: 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20  pr(pExpr);.     
c940: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c950: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 28 63 68  v, op, 0, 0, (ch
c960: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
c970: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
c980: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
c990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c9a0: 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
c9b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c9c0: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
c9d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
c9e0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
c9f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f   SQLITE_OMIT_BLO
ca00: 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61  B_LITERAL.    ca
ca10: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
ca20: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
ca30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
ca40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
ca50: 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f  _BLOB==OP_HexBlo
ca60: 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70  b );.      n = p
ca70: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20  Expr->token.n - 
ca80: 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  3;.      z = (ch
ca90: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
caa0: 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61 73  .z + 2;.      as
cab0: 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
cac0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
cad0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b 0a          z = "";.
cae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
caf0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
cb00: 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  op, 0, 0, z, n);
cb10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cb20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
cb30: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
cb40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
cb50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cb60: 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
cb70: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
cb80: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f     if( pExpr->to
cb90: 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20  ken.n>1 ){.     
cba0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
cbb0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 63  angeP3(v, -1, (c
cbc0: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
cbd0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
cbe0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n.n);.      }.  
cbf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cc00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
cc10: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
cc20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cc30: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
cc40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
cc50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
cc60: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
cc70: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
cc80: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20    case TK_CAST: 
cc90: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
cca0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
ccb0: 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74  rm:   CAST(pLeft
ccc0: 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20   AS token) */.  
ccd0: 20 20 20 20 69 6e 74 20 61 66 66 2c 20 74 6f 5f      int aff, to_
cce0: 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
ccf0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cd00: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
cd10: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c  .      aff = sql
cd20: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
cd30: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b  (&pExpr->token);
cd40: 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20 3d 20 61  .      to_op = a
cd50: 66 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff - SQLITE_AFF_
cd60: 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74  TEXT + OP_ToText
cd70: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cd80: 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54 65 78 74  to_op==OP_ToText
cd90: 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
cda0: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 29  TE_AFF_TEXT    )
cdb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cdc0: 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62  to_op==OP_ToBlob
cdd0: 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
cde0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 29  TE_AFF_NONE    )
cdf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ce00: 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65  to_op==OP_ToNume
ce10: 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49  ric || aff!=SQLI
ce20: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
ce30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ce40: 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20  to_op==OP_ToInt 
ce50: 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
ce60: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
ce70: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ce80: 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  to_op==OP_ToReal
ce90: 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
cea0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29  TE_AFF_REAL    )
ceb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cec0: 64 62 65 41 64 64 4f 70 28 76 2c 20 74 6f 5f 6f  dbeAddOp(v, to_o
ced0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
cee0: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
cef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cf00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
cf10: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
cf20: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
cf30: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
cf40: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
cf50: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
cf60: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
cf70: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
cf80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
cf90: 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  TK_LT==OP_Lt );.
cfa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
cfb0: 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20  _LE==OP_Le );.  
cfc0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
cfd0: 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20  T==OP_Gt );.    
cfe0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
cff0: 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ge );.      
d000: 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f  assert( TK_EQ==O
d010: 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
d020: 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f  sert( TK_NE==OP_
d030: 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ne );.      sqli
d040: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d050: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d060: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d070: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d080: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
d090: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
d0a0: 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
d0b0: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
d0c0: 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30  pRight, op, 0, 0
d0d0: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
d0e0: 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62  ng = -1;.      b
d0f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d100: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
d110: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
d120: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
d130: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
d140: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
d150: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
d160: 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
d170: 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
d180: 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
d190: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
d1a0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
d1b0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
d1c0: 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
d1d0: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
d1e0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
d1f0: 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20  ND==OP_And );.  
d200: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
d210: 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20  R==OP_Or );.    
d220: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
d230: 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20  S==OP_Add );.   
d240: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
d250: 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
d260: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
d270: 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
d280: 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20  ainder );.      
d290: 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
d2a0: 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a  D==OP_BitAnd );.
d2b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
d2c0: 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
d2d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
d2e0: 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
d2f0: 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61  ivide );.      a
d300: 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
d310: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
d320: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d330: 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
d340: 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20  iftRight );.    
d350: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
d360: 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
d370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d380: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d390: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
d3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d3b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
d3c0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
d3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d3e0: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
d3f0: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
d400: 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72  g = -1;.      br
d410: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d420: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
d430: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
d440: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
d450: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
d460: 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
d470: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
d480: 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74  K_FLOAT || pLeft
d490: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
d4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65   ){.        Toke
d4b0: 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74  n *p = &pLeft->t
d4c0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 63 68  oken;.        ch
d4d0: 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 4d  ar *z = sqlite3M
d4e0: 50 72 69 6e 74 66 28 22 2d 25 2e 2a 73 22 2c 20  Printf("-%.*s", 
d4f0: 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20  p->n, p->z);.   
d500: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
d510: 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a  op==TK_FLOAT ){.
d520: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d530: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52  3VdbeOp3(v, OP_R
d540: 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 70 2d  eal, 0, 0, z, p-
d550: 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  >n+1);.        }
d560: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d570: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 7a  codeInteger(v, z
d580: 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20  , p->n+1);.     
d590: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
d5a0: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
d5b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d5c0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
d5d0: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b   through into TK
d5e0: 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  _NOT */.    }.  
d5f0: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
d600: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
d610: 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
d620: 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
d630: 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20  _BitNot );.     
d640: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d   assert( TK_NOT=
d650: 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20  =OP_Not );.     
d660: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d670: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
d680: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
d690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d6a0: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
d6b0: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
d6c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d6d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
d6e0: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
d6f0: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
d700: 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a        int dest;.
d710: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
d720: 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
d730: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
d740: 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
d750: 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
d760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d770: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
d780: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  er, 1, 0);.     
d790: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d7a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
d7b0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65  pLeft);.      de
d7c0: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
d7d0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
d7e0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
d7f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
d800: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
d810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d820: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
d830: 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73   -1, 0);.      s
d840: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
d850: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d860: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
d870: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
d880: 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66     AggInfo *pInf
d890: 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
d8a0: 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
d8b0: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
d8c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d8d0: 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
d8e0: 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
d8f0: 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %T",.          
d900: 20 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b    &pExpr->span);
d910: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d930: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
d940: 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e 61 46 75  Load, pInfo->aFu
d950: 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e  nc[pExpr->iAgg].
d960: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iMem, 0);.      
d970: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
d980: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
d990: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
d9a0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
d9b0: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
d9c0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
d9d0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
d9e0: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
d9f0: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
da00: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
da10: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
da20: 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
da30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
da40: 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
da50: 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  tMask = 0;.     
da60: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 38   int i;.      u8
da70: 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
da80: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 43 6f  e->db);.      Co
da90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
daa0: 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28 63  ;.      zId = (c
dab0: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
dac0: 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  n.z;.      nId =
dad0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b   pExpr->token.n;
dae0: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
daf0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
db00: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
db10: 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65  d, nId, nExpr, e
db20: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  nc, 0);.      as
db30: 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b  sert( pDef!=0 );
db40: 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73  .      nExpr = s
db50: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
db60: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
db70: 4c 69 73 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  List);.#ifndef S
db80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
db90: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a  ALTABLE.      /*
dba0: 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f   Possibly overlo
dbb0: 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ad the function 
dbc0: 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  if the first arg
dbd0: 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a  ument is.      *
dbe0: 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * a virtual tabl
dbf0: 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20  e column..      
dc00: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
dc10: 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
dc20: 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47  (LIKE, GLOB, REG
dc30: 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20  EXP, and MATCH) 
dc40: 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  use the.      **
dc50: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
dc60: 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c  , not the first,
dc70: 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
dc80: 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20   to test to.    
dc90: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
dca0: 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  s a column in a 
dcb0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20  virtual table.  
dcc0: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63  This is done bec
dcd0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
dce0: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
dcf0: 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  f infix function
dd00: 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77  s (the operand w
dd10: 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20  e want to.      
dd20: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c  ** control overl
dd30: 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20  oading) ends up 
dd40: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
dd50: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  gument to the.  
dd60: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
dd70: 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e    The expression
dd80: 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65   "A glob B" is e
dd90: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20  quivalent to .  
dda0: 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41      ** "glob(B,A
ddb0: 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75  ).  We want to u
ddc0: 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67  se the A in "A g
ddd0: 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20  lob B" to test. 
dde0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63       ** for func
ddf0: 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67  tion overloading
de00: 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68  .  But we use th
de10: 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f  e B term in "glo
de20: 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a  b(B,A)"..      *
de30: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 70  /.      if( nExp
de40: 72 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e  r>=2 && (pExpr->
de50: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78  flags & EP_Infix
de60: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
de70: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56   pDef = sqlite3V
de80: 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74  tabOverloadFunct
de90: 69 6f 6e 28 70 44 65 66 2c 20 6e 45 78 70 72 2c  ion(pDef, nExpr,
dea0: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
deb0: 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
dec0: 20 69 66 28 20 6e 45 78 70 72 3e 30 20 29 7b 0a   if( nExpr>0 ){.
ded0: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
dee0: 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
def0: 61 64 46 75 6e 63 74 69 6f 6e 28 70 44 65 66 2c  adFunction(pDef,
df00: 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61   nExpr, pList->a
df10: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
df20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
df30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
df40: 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b  r && i<32; i++){
df50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
df60: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
df70: 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  nt(pList->a[i].p
df80: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
df90: 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
dfa0: 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20  (1<<i);.        
dfb0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  }.        if( pD
dfc0: 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
dfd0: 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
dfe0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
dff0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
e000: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
e010: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
e020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e030: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
e040: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
e050: 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
e060: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  l ) pColl = pPar
e070: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
e080: 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l; .        sqli
e090: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
e0a0: 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
e0b0: 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
e0c0: 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  3_COLLSEQ);.    
e0d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e0e0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46  3VdbeOp3(v, OP_F
e0f0: 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61  unction, constMa
e100: 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72  sk, nExpr, (char
e110: 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44  *)pDef, P3_FUNCD
e120: 45 46 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b  EF);.      stack
e130: 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70 72 3b 0a  Chng = 1-nExpr;.
e140: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e150: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
e160: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
e170: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
e180: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
e190: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
e1a0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
e1b0: 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn==0 ){.       
e1c0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
e1d0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
e1e0: 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
e1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e200: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
e210: 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ad, pExpr->iColu
e220: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64  mn, 0);.      Vd
e230: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
e240: 20 6c 6f 61 64 20 73 75 62 71 75 65 72 79 20 72   load subquery r
e250: 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20  esult"));.      
e260: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e270: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
e280: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
e290: 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69       char affini
e2a0: 74 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6b  ty;.      int ck
e2b0: 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Offset = pParse-
e2c0: 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  >ckOffset;.     
e2d0: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
e2e0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
e2f0: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  xpr);..      /* 
e300: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
e310: 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
e320: 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
e330: 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
e340: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
e350: 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
e360: 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
e370: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
e380: 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  uitable for.    
e390: 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61    ** P3 of OP_Ma
e3a0: 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20  keRecord..      
e3b0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  */.      affinit
e3c0: 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
e3d0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
e3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e3f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
e400: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
e410: 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66     pParse->ckOff
e420: 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 2b 31  set = ckOffset+1
e430: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
e440: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
e450: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
e460: 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72  )". The temporar
e470: 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  y table.      **
e480: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63   pExpr->iTable c
e490: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
e4a0: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
e4b0: 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20  the (...) set.. 
e4c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
e4d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e4e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
e4f0: 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ft);.      addr 
e500: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
e510: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
e520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e530: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
e540: 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20  l, -1, addr+4); 
e550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
e560: 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20  dr + 0 */.      
e570: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e580: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
e590: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e5a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e5b0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
e5c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e5d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
e5e0: 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20  0, addr+7);.    
e5f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
e600: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
e610: 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  d, 1, 0, &affini
e620: 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64  ty, 1);   /* add
e630: 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73  r + 4 */.      s
e640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e650: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
e660: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72  pr->iTable, addr
e670: 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +7);.      sqlit
e680: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e690: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
e6a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6b0: 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a     /* addr + 6 *
e6c0: 2f 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  /..      break;.
e6d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
e6e0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
e6f0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
e700: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
e710: 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
e720: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e730: 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
e740: 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  ->pList->a;.    
e750: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
e760: 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
e770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e780: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
e790: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
e7a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e7b0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
e7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e7d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
e7e0: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
e7f0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
e800: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
e810: 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Ge, 0, 0);.   
e820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e830: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
e840: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49  1, 0);.      pLI
e850: 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
e860: 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
e870: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
e880: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e890: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
e8a0: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
e8b0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
e8c0: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30  ght, OP_Le, 0, 0
e8d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e8e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e8f0: 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  And, 0, 0);.    
e900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e910: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
e920: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  :.    case TK_AS
e930: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e940: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e950: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
e960: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
e970: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
e980: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e990: 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
e9a0: 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f     int expr_end_
e9b0: 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74  label;.      int
e9c0: 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20   jumpInst;.     
e9d0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
e9e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
e9f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
ea00: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
ea10: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
ea20: 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61  stelem;..      a
ea30: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
ea40: 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
ea50: 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t((pExpr->pList-
ea60: 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
ea70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ea80: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
ea90: 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
eaa0: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
eab0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
eac0: 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
ead0: 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
eae0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
eaf0: 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f  .      expr_end_
eb00: 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  label = sqlite3V
eb10: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
eb20: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
eb30: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
eb40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
eb50: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
eb60: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
eb70: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
eb80: 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
eb90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
eba0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ebb0: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
ebc0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
ebd0: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
ebe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ebf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ec00: 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a   OP_Dup, 1, 1);.
ec10: 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e            jumpIn
ec20: 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  st = codeCompare
ec30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ec40: 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d  pLeft, aListelem
ec50: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
ec80: 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 0, 1);.      
ec90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eca0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
ecb0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
ecc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ecd0: 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74  jumpInst = sqlit
ece0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ecf0: 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a  P_IfNot, 1, 0);.
ed00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ed10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ed20: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
ed30: 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b  lem[i+1].pExpr);
ed40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ed50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ed60: 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e  Goto, 0, expr_en
ed70: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
ed80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ed90: 70 48 65 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73  pHere(v, jumpIns
eda0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
edb0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
edc0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
edd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ede0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
edf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ee00: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
ee10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ee20: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ee30: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
ee40: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
ee50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ee60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ee70: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
ee80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ee90: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
eea0: 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c  el(v, expr_end_l
eeb0: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  abel);.      bre
eec0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
eed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
eee0: 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
eef0: 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
ef00: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72   if( !pParse->tr
ef10: 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20  igStack ){.     
ef20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ef30: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
ef60: 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
ef70: 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
ef80: 67 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b  gram");..return;
ef90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
efa0: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
efb0: 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  n!=OE_Ignore ){.
efc0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
efd0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
efe0: 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a  =OE_Rollback ||.
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
f010: 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20  == OE_Abort ||. 
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
f040: 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20  = OE_Fail );.   
f050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
f060: 75 6f 74 65 45 78 70 72 28 70 45 78 70 72 29 3b  uoteExpr(pExpr);
f070: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
f080: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48  3VdbeOp3(v, OP_H
f090: 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  alt, SQLITE_CONS
f0a0: 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69  TRAINT, pExpr->i
f0b0: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
f0e0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
f0f0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20  ken.n);.      } 
f100: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
f110: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
f120: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e  Column == OE_Ign
f130: 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ore );.         
f140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f150: 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f  (v, OP_ContextPo
f160: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
f170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f180: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
f190: 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  0, pParse->trigS
f1a0: 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70  tack->ignoreJump
f1b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65  );.         Vdbe
f1c0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72  Comment((v, "# r
f1d0: 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b  aise(IGNORE)"));
f1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f1f0: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
f200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f210: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
f220: 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  f( pParse->ckOff
f230: 73 65 74 20 29 7b 0a 20 20 20 20 70 50 61 72 73  set ){.    pPars
f240: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 2b 3d 20 73  e->ckOffset += s
f250: 74 61 63 6b 43 68 6e 67 3b 0a 20 20 20 20 61 73  tackChng;.    as
f260: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
f270: 4f 66 66 73 65 74 20 29 3b 0a 20 20 7d 0a 7d 0a  Offset );.  }.}.
f280: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f290: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a  OMIT_TRIGGER./*.
f2a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
f2b0: 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74   that evalutes t
f2c0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
f2d0: 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74  ion and leaves t
f2e0: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
f2f0: 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20  the stack.  See 
f300: 61 6c 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72  also sqlite3Expr
f310: 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Code()..**.** Th
f320: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
f330: 20 61 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20   also cache the 
f340: 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66  result and modif
f350: 79 20 74 68 65 20 70 45 78 70 72 20 74 72 65 65  y the pExpr tree
f360: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77  .** so that it w
f370: 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20  ill make use of 
f380: 74 68 65 20 63 61 63 68 65 64 20 72 65 73 75 6c  the cached resul
f390: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
f3a0: 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72  evaluations.** r
f3b0: 61 74 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75  ather than evalu
f3c0: 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ate the whole ex
f3d0: 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20  pression again. 
f3e0: 20 54 72 69 76 69 61 6c 20 65 78 70 72 65 73 73   Trivial express
f3f0: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20  ions are.** not 
f400: 63 61 63 68 65 64 2e 20 20 49 66 20 74 68 65 20  cached.  If the 
f410: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61  expression is ca
f420: 63 68 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74  ched, its result
f430: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
f440: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  .** memory locat
f450: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
f460: 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
f470: 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
f480: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
f490: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
f4a0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
f4b0: 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61  nt iMem;.  int a
f4c0: 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69  ddr1, addr2;.  i
f4d0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
f4e0: 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
f4f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f500: 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  dr(v);.  sqlite3
f510: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f520: 20 70 45 78 70 72 29 3b 0a 20 20 61 64 64 72 32   pExpr);.  addr2
f530: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
f540: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
f550: 69 66 28 20 61 64 64 72 32 3e 61 64 64 72 31 2b  if( addr2>addr1+
f560: 31 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65  1 || sqlite3Vdbe
f570: 47 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29 2d  GetOp(v, addr1)-
f580: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63  >opcode==OP_Func
f590: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d  tion ){.    iMem
f5a0: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
f5b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
f5c0: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
f5d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
f5e0: 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29  mStore, iMem, 0)
f5f0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
f600: 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
f610: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
f620: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
f630: 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65   that pushes the
f640: 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
f650: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
f660: 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
f670: 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65  on list onto the
f680: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   stack..**.** Re
f690: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
f6a0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68  of elements push
f6b0: 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ed onto the stac
f6c0: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
f6d0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
f6e0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
f6f0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
f700: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f710: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
f720: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
f730: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
f740: 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74  coded */.){.  st
f750: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
f760: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
f770: 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 70 4c 69   i, n;.  if( pLi
f780: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
f790: 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  ;.  n = pList->n
f7a0: 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
f7b0: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b  m=pList->a, i=n;
f7c0: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
f7d0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
f7e0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f7f0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
f800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
f810: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f820: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
f830: 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
f840: 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
f850: 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
f860: 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
f870: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f880: 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
f890: 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
f8a0: 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
f8b0: 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
f8c0: 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
f8d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
f8e0: 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
f8f0: 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
f900: 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
f910: 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
f920: 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
f930: 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
f940: 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  is true..**.** T
f950: 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
f960: 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
f970: 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
f980: 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
f990: 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
f9a0: 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
f9b0: 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
f9c0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
f9d0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
f9e0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
f9f0: 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
fa00: 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
fa10: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
fa20: 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
fa30: 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
fa40: 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
fa50: 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
fa60: 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
fa70: 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
fa80: 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
fa90: 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
faa0: 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
fab0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
fac0: 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
fad0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
fae0: 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
faf0: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
fb00: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
fb10: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
fb20: 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66  = 0;.  int ckOff
fb30: 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b  set = pParse->ck
fb40: 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d  Offset;.  if( v=
fb50: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
fb60: 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20   return;.  op = 
fb70: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
fb80: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
fb90: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
fba0: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
fbb0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
fbc0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
fbd0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
fbe0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
fbf0: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
fc00: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
fc10: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
fc20: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
fc30: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
fc40: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
fc50: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
fc60: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
fc70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fc80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
fc90: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
fca0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
fcb0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
fcc0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
fcd0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
fce0: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
fcf0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
fd00: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
fd10: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
fd20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fd30: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
fd40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
fd50: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
fd60: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
fd70: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
fd80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fd90: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
fda0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
fdb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
fdc0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
fdd0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
fde0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
fdf0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
fe00: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
fe10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fe20: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
fe30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
fe40: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
fe50: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
fe60: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
fe70: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
fe80: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
fe90: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
fea0: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
feb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fec0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
fed0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
fee0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
fef0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
ff00: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
ff10: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
ff20: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
ff30: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65  ->pRight, op, de
ff40: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ff50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ff60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ff70: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
ff80: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
ff90: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ffa0: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
ffb0: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
ffc0: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
ffd0: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
ffe0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
fff0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
10000 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
10010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10020 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
10030 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10040 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10050 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
10060 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
10070 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ion "x BETWEEN y
10080 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65   AND z" is imple
10090 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
100a0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
100b0 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33  F (x < y) GOTO 3
100c0 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28  .      ** 2 IF (
100d0 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65  x <= z) GOTO <de
100e0 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e  st>.      ** 3 .
100f0 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
10100 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
10110 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
10120 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
10130 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
10140 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
10150 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
10160 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10170 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
10180 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10190 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
101a0 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
101b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
101c0 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
101d0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
101e0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
101f0 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
10200 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75  t, OP_Lt, 0, !ju
10210 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
10220 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
10230 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
10240 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
10250 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10260 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
10270 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
10280 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
10290 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74  ght, OP_Le, dest
102a0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a  , jumpIfNull);..
102b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
102c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
102d0 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
102e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
102f0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
10300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10310 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
10320 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
10330 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10340 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
10350 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10360 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
10370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10380 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
10390 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  f, jumpIfNull, d
103a0 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
103b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  k;.    }.  }.  p
103c0 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
103d0 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  = ckOffset;.}../
103e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
103f0 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
10400 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
10410 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
10420 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
10430 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
10440 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10450 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
10460 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
10470 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
10480 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
10490 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
104a0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
104b0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
104c0 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
104d0 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
104e0 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
104f0 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65  mpIfNull is true
10500 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
10510 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
10520 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64  s false..*/.void
10530 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
10540 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
10550 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
10560 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
10570 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
10580 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
10590 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
105a0 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73   0;.  int ckOffs
105b0 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f  et = pParse->ckO
105c0 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d  ffset;.  if( v==
105d0 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
105e0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
105f0 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
10600 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
10610 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
10620 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
10630 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
10640 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
10650 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
10660 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
10670 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
10680 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
10690 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
106a0 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
106b0 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
106c0 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
106d0 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
106e0 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
106f0 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
10700 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
10710 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
10720 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
10730 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
10740 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
10750 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
10760 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
10770 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
10780 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
10790 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
107a0 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
107b0 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
107c0 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
107d0 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
107e0 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
107f0 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
10800 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
10810 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
10820 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
10830 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
10840 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
10850 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
10860 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
10870 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
10880 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
10890 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
108a0 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
108b0 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
108c0 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
108d0 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
108e0 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
108f0 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
10900 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
10910 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10920 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
10930 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
10940 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
10950 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
10960 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
10970 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
10980 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
10990 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
109a0 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
109b0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
109c0 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
109d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
109e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
109f0 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
10a00 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
10a10 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
10a20 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
10a30 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
10a40 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
10a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
10a60 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
10a70 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
10a80 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
10a90 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
10aa0 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
10ab0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
10ac0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
10ad0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
10ae0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
10af0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
10b00 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
10b10 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
10b20 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
10b30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10b40 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
10b50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
10b60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10b70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
10b80 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
10b90 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
10ba0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
10bb0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
10bc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
10bd0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
10be0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
10bf0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
10c00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10c10 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
10c20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
10c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
10c40 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
10c50 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
10c60 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
10c70 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
10c80 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
10c90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10ca0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
10cb0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
10cc0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
10cd0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
10ce0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
10cf0 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
10d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10d10 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10d20 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
10d30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10d40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10d50 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
10d60 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
10d70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10d80 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
10d90 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
10da0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
10db0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10dc0 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
10dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
10de0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
10df0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10e00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
10e10 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
10e20 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
10e30 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
10e40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10e50 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
10e60 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EEN: {.      /* 
10e70 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
10e80 73 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41  s "x BETWEEN y A
10e90 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70  ND z". It is imp
10ea0 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20  lemented as:.   
10eb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31     **.      ** 1
10ec0 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54   IF (x >= y) GOT
10ed0 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47  O 3.      ** 2 G
10ee0 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
10ef0 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29   ** 3 IF (x > z)
10f00 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
10f10 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
10f20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72  addr;.      Expr
10f30 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
10f40 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
10f50 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
10f60 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
10f70 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
10f80 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10f90 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
10fa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10fb0 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
10fc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10fd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10fe0 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
10ff0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
11000 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11010 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  (v);.      codeC
11020 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
11030 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
11040 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75  _Ge, addr+3, !ju
11050 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
11060 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11070 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
11080 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11090 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
110a0 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
110b0 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
110c0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
110d0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
110e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
110f0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
11100 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
11110 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
11120 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74  t, pRight, OP_Gt
11130 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
11140 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
11150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
11160 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
11170 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
11180 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
11190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
111a0 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
111b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
111c0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
111d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
111e0 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20  rse->ckOffset = 
111f0 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  ckOffset;.}../*.
11200 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
11210 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
11220 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
11230 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e    Return TRUE (n
11240 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74  on-zero).** if t
11250 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
11260 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c  l and return FAL
11270 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65  SE if they diffe
11280 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f  r in any way..*/
11290 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
112a0 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
112b0 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
112c0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
112d0 30 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  0||pB==0 ){.    
112e0 72 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20  return pB==pA;. 
112f0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
11300 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
11310 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66   0;.  if( (pA->f
11320 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
11330 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
11340 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
11350 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
11360 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
11370 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
11380 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74  pB->pLeft) ) ret
11390 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
113a0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
113b0 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d  (pA->pRight, pB-
113c0 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
113d0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70  n 0;.  if( pA->p
113e0 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  List ){.    if( 
113f0 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72  pB->pList==0 ) r
11400 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
11410 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pA->pList->nExp
11420 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45  r!=pB->pList->nE
11430 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  xpr ) return 0;.
11440 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11450 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  A->pList->nExpr;
11460 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
11470 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
11480 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e  pare(pA->pList->
11490 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e  a[i].pExpr, pB->
114a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
114b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
114c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
114d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
114e0 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pB->pList ){. 
114f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11500 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65  .  if( pA->pSele
11510 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63  ct || pB->pSelec
11520 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
11530 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d  if( pA->iTable!=
11540 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41  pB->iTable || pA
11550 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
11560 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
11570 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b  0;.  if( pA->tok
11580 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  en.z ){.    if( 
11590 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  pB->token.z==0 )
115a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
115b0 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  f( pB->token.n!=
115c0 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65  pA->token.n ) re
115d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
115e0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
115f0 28 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e  (char*)pA->token
11600 2e 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f  .z,(char*)pB->to
11610 6b 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e  ken.z,pB->token.
11620 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  n)!=0 ){.      r
11630 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
11640 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
11650 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
11660 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
11670 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  e pAggInfo->aCol
11680 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
11690 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
116a0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
116b0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
116c0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
116d0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
116e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
116f0 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 41 67 67  ggInfoColumn(Agg
11700 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
11710 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 73 71 6c  int i;.  i = sql
11720 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
11730 65 28 28 76 6f 69 64 2a 2a 29 26 70 49 6e 66 6f  e((void**)&pInfo
11740 2d 3e 61 43 6f 6c 2c 20 73 69 7a 65 6f 66 28 70  ->aCol, sizeof(p
11750 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 20  Info->aCol[0]), 
11760 33 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b  3);.  if( i<0 ){
11770 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
11780 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
11790 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
117a0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
117b0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
117c0 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
117d0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
117e0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
117f0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
11800 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
11810 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
11820 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
11830 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
11840 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
11850 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
11860 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
11870 63 61 74 65 28 28 76 6f 69 64 2a 2a 29 26 70 49  cate((void**)&pI
11880 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 73 69 7a 65  nfo->aFunc, size
11890 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
118a0 30 5d 29 2c 20 32 29 3b 0a 20 20 69 66 28 20 69  0]), 2);.  if( i
118b0 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
118c0 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
118d0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
118e0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75  * This is an xFu
118f0 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54  nc for walkExprT
11900 72 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d  ree() used to im
11910 70 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69  plement .** sqli
11920 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
11930 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
11940 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
11950 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
11960 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
11970 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
11980 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11990 61 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67  analyzes the agg
119a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
119b0 61 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61  at pExpr..*/.sta
119c0 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
119d0 67 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70  ggregate(void *p
119e0 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
119f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
11a00 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
11a10 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29   (NameContext *)
11a20 70 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70  pArg;.  Parse *p
11a30 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
11a40 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
11a50 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
11a60 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
11a70 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
11a80 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  pNC->pAggInfo;. 
11a90 20 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   ..  switch( pEx
11aa0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
11ab0 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
11ac0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
11ad0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
11ae0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
11af0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
11b00 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
11b10 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
11b20 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
11b30 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
11b40 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
11b50 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
11b60 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
11b70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
11b80 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
11b90 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
11ba0 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
11bb0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
11bc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
11bd0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
11be0 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
11bf0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
11c00 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
11c10 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
11c20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
11c30 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
11c40 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
11c50 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
11c60 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
11c70 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
11c80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
11c90 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
11ca0 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
11cb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
11cc0 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
11cd0 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
11ce0 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
11cf0 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
11d00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
11d10 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
11d20 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
11d30 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
11d40 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
11d50 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
11d60 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
11d70 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
11d80 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 2c 20 70  >nColumn; i++, p
11d90 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
11da0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
11db0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
11dc0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
11dd0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
11de0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
11df0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
11e00 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
11e10 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
11e20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
11e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
11e40 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43   i>=pAggInfo->nC
11e50 6f 6c 75 6d 6e 20 26 26 20 28 69 20 3d 20 61 64  olumn && (i = ad
11e60 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
11e70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29 7b 0a  AggInfo))>=0 ){.
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
11e90 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
11ea0 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
11eb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
11ec0 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
11ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
11ee0 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
11ef0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
11f00 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
11f10 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
11f20 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
11f30 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
11f40 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
11f50 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
11f60 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
11f70 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
11f80 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
11f90 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
11fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
11fb0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
11fc0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
11fd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
11fe0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
11ff0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
12000 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
12010 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
12020 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
12030 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
12040 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
12060 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
12080 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
12090 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
120a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
120b0 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
120c0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
120d0 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
120e0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
120f0 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
12100 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
12130 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
12140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12150 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
12160 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12190 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
121d0 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
121e0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
121f0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
12200 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
12210 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
12220 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
12230 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
12240 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
12260 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
12270 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
12280 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
12290 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
122a0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
122b0 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
122c0 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
122d0 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
122e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
122f0 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
12300 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
12310 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
12320 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
12330 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
12340 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
12350 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
12360 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
12370 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
12380 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
12390 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
123a0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20  TK_AGG_COLUMN;. 
123b0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
123c0 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
123d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
123e0 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
123f0 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
12400 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
12410 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
12420 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
12430 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
12440 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
12450 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
12460 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
12470 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ON: {.      /* T
12480 68 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  he pNC->nDepth==
12490 30 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67  0 test causes ag
124a0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
124b0 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a  s in subqueries.
124c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
124d0 67 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  gnored */.      
124e0 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d  if( pNC->nDepth=
124f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
12500 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12510 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
12520 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
12530 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
12540 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
12550 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
12560 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
12570 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
12580 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
12590 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
125a0 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
125b0 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
125c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
125d0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
125e0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
125f0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
12600 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
12610 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
12620 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
12630 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12640 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12650 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
12660 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
12670 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
12680 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
12690 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
126a0 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
126b0 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
126c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
126d0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
126e0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
126f0 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
12700 66 6f 46 75 6e 63 28 70 41 67 67 49 6e 66 6f 29  foFunc(pAggInfo)
12710 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12720 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
12730 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
12740 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
12750 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
12760 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
12770 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
12780 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  Item->iMem = pPa
12790 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
127a0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
127b0 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
127c0 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
127d0 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
127e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
127f0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
12800 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
12810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12820 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
12830 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t ? pExpr->pList
12840 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63  ->nExpr : 0, enc
12850 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
12860 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
12870 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
12880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12890 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
128a0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
128b0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b++;.           
128c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
128d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
128e0 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
128f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12910 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
12920 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20   pExpr point to 
12930 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
12940 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
12950 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  ] entry.        
12960 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
12970 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
12980 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
12990 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
129a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
129b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
129c0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73    }..  /* Recurs
129d0 69 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71 75  ively walk subqu
129e0 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  eries looking fo
129f0 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  r TK_COLUMN node
12a00 73 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a  s that need.  **
12a10 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74   to be changed t
12a20 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
12a30 20 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74 20    But increment 
12a40 6e 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a 20  nDepth so that. 
12a50 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   ** TK_AGG_FUNCT
12a60 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75 62  ION nodes in sub
12a70 71 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65 20  queries will be 
12a80 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
12a90 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
12aa0 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d  lect ){.    pNC-
12ab0 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77  >nDepth++;.    w
12ac0 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45  alkSelectExpr(pE
12ad0 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e  xpr->pSelect, an
12ae0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
12af0 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e  pNC);.    pNC->n
12b00 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72  Depth--;.  }.  r
12b10 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12b20 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
12b30 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
12b40 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
12b50 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
12b60 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
12b70 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
12b80 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
12b90 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
12ba0 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
12bb0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
12bc0 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
12bd0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
12be0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
12bf0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
12c00 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
12c10 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
12c20 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
12c30 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
12c40 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  y sqlite3ExprRes
12c50 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a  olveNames()..**.
12c60 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65  ** If errors are
12c70 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20   seen, leave an 
12c80 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
12c90 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74   zErrMsg and ret
12ca0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
12cb0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
12cc0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  int sqlite3ExprA
12cd0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
12ce0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
12cf0 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
12d00 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e  .  int nErr = pN
12d10 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  C->pParse->nErr;
12d20 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
12d30 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67  pExpr, analyzeAg
12d40 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20  gregate, pNC);. 
12d50 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61   return pNC->pPa
12d60 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72  rse->nErr - nErr
12d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
12d80 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
12d90 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
12da0 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
12db0 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
12dc0 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
12dd0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
12de0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
12df0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
12e00 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
12e10 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
12e20 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
12e30 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
12e40 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
12e50 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
12e60 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
12e70 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
12e80 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
12e90 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
12ea0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
12eb0 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
12ec0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72 72  st->a, i=0; nErr
12ed0 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e  ==0 && i<pList->
12ee0 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
12ef0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72 72  m++){.      nErr
12f00 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41   += sqlite3ExprA
12f10 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
12f20 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
12f30 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
12f40 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a   return nErr;.}.