/ Hex Artifact Content
Login

Artifact 714a06707facc5152228f2c1758d5003bd3a5b3c:


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 34 33 20 32 30 30 36 2f 30 31 2f 30 33 20  .243 2006/01/03 
0220: 31 35 3a 31 36 3a 32 36 20 64 72 68 20 45 78 70  15:16:26 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 52 65 74 75 72  ;.}../*.** Retur
05f0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  n the default co
0600: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0610: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0620: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0630: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0640: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74  ault collation t
0650: 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ype, return 0..*
0660: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
0670: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61  e3ExprCollSeq(Pa
0680: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0690: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
06a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
06b0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
06c0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70      pColl = pExp
06d0: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  r->pColl;.    if
06e0: 28 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ( (pExpr->op==TK
06f0: 5f 41 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _AS || pExpr->op
0700: 3d 3d 54 4b 5f 43 41 53 54 29 20 26 26 20 21 70  ==TK_CAST) && !p
0710: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
0720: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0730: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0740: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
0750: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
0760: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
0770: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0780: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0790: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
07a0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
07b0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
07c0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
07d0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
07e0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
07f0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0800: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0810: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
0820: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
0830: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0840: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
0850: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
0860: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0870: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0880: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0890: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
08a0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
08b0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
08c0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
08d0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
08e0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
08f0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0900: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0910: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
0920: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
0930: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
0940: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
0950: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
0960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
0970: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0980: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
0990: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
09a0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
09b0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
09c0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
09d0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
09e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
09f0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
0a00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
0a10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
0a20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
0a30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
0a40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
0a50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
0a60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
0a70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
0a80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
0a90: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
0aa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
0ab0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
0ac0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
0ad0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
0ae0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
0af0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
0b00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
0b10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
0b20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
0b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
0b40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
0b50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
0b60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
0b70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0b80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
0b90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
0ba0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
0bb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
0bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
0bd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
0be0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
0bf0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
0c00: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
0c10: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
0c20: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
0c30: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
0c40: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
0c50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
0c60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
0c70: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
0c80: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
0c90: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
0ca0: 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _NE );.  assert(
0cb0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
0cc0: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
0cd0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
0ce0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
0cf0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
0d00: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0d10: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0d20: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
0d30: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65  t, aff);.  }.  e
0d40: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
0d50: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66  Select ){.    af
0d60: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
0d70: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
0d80: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
0d90: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
0da0: 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  ff);.  }.  else 
0db0: 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20  if( !aff ){.    
0dc0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
0dd0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 7d 0a 20 20  _NUMERIC;.  }.  
0de0: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
0df0: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
0e00: 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65  comparison expre
0e10: 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20  ssion, eg. '=', 
0e20: 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63  '<', IN(...) etc
0e30: 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74  ..** idx_affinit
0e40: 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74  y is the affinit
0e50: 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  y of an indexed 
0e60: 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74  column. Return t
0e70: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e  rue.** if the in
0e80: 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74  dex with affinit
0e90: 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d  y idx_affinity m
0ea0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  ay be used to im
0eb0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63  plement.** the c
0ec0: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78  omparison in pEx
0ed0: 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
0ee0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
0ef0: 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  k(Expr *pExpr, c
0f00: 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79  har idx_affinity
0f10: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  ){.  char aff = 
0f20: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
0f30: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69  ty(pExpr);.  swi
0f40: 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20  tch( aff ){.    
0f50: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
0f60: 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75  NONE:.      retu
0f70: 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53  rn 1;.    case S
0f80: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
0f90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78        return idx
0fa0: 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  _affinity==SQLIT
0fb0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
0fc0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
0fd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e  eturn sqlite3IsN
0fe0: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69  umericAffinity(i
0ff0: 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  dx_affinity);.  
1000: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1010: 6e 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 74  n the P1 value t
1020: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1030: 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20  ed for a binary 
1040: 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70  comparison.** op
1050: 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f  code (OP_Eq, OP_
1060: 47 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f  Ge etc.) used to
1070: 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20   compare pExpr1 
1080: 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49  and pExpr2..** I
1090: 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
10a0: 74 72 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74  true, then set t
10b0: 68 65 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74  he low byte of t
10c0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50  he returned.** P
10d0: 31 20 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20  1 value to tell 
10e0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75  the opcode to ju
10f0: 6d 70 20 69 66 20 65 69 74 68 65 72 20 65 78 70  mp if either exp
1100: 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75  ression.** evalu
1110: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f  ates to NULL..*/
1120: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61  .static int bina
1130: 72 79 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72  ryCompareP1(Expr
1140: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
1150: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
1160: 49 66 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20  IfNull){.  char 
1170: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1180: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
1190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e  );.  return ((in
11a0: 74 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  t)sqlite3Compare
11b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c  Affinity(pExpr1,
11c0: 20 61 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75   aff))+(jumpIfNu
11d0: 6c 6c 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a  ll?0x100:0);.}..
11e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
11f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
1200: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1210: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1220: 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e  used by.** a bin
1230: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  ary comparison o
1240: 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e  perator comparin
1250: 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  g pLeft and pRig
1260: 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ht..**.** If the
1270: 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72 65   left hand expre
1280: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
1290: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
12a0: 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a  ype, then it is.
12b0: 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69  ** used. Otherwi
12c0: 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  se the collation
12d0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
12e0: 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78 70  e right hand exp
12f0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73  ression.** is us
1300: 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75  ed, or the defau
1310: 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e  lt (BINARY) if n
1320: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
1330: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1340: 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74  g.** type..*/.st
1350: 61 74 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69  atic CollSeq* bi
1360: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1370: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
1380: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
1390: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
13a0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
13b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
13c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
13d0: 74 29 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c  t);.  if( !pColl
13e0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
13f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1400: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
1410: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
1420: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
1430: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1440: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
1450: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
1460: 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70  tic int codeComp
1470: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
1480: 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  arse,    /* The 
1490: 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64  parsing (and cod
14a0: 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f  e generating) co
14b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
14c0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20  *pLeft,      /* 
14d0: 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  The left operand
14e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
14f0: 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  ht,     /* The r
1500: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
1510: 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20    int opcode,   
1520: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
1530: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  rison opcode */.
1540: 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1550: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1560: 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20   if true.  */.  
1570: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
1580: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75    /* If true, ju
1590: 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65  mp if either ope
15a0: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  rand is NULL */.
15b0: 29 7b 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69  ){.  int p1 = bi
15c0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c  naryCompareP1(pL
15d0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
15e0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c  pIfNull);.  Coll
15f0: 53 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79  Seq *p3 = binary
1600: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
1610: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
1620: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
1630: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70  sqlite3VdbeOp3(p
1640: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70  Parse->pVdbe, op
1650: 63 6f 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20  code, p1, dest, 
1660: 28 76 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f  (void*)p3, P3_CO
1670: 4c 4c 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSEQ);.}../*.**
1680: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
1690: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
16a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
16b0: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
16c0: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
16d0: 20 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65   node is obtaine
16e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
16f0: 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
1700: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
1710: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1720: 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  or making sure t
1730: 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c  he node eventual
1740: 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a  ly gets freed..*
1750: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
1760: 78 70 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72  xpr(int op, Expr
1770: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
1780: 52 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b  Right, const Tok
1790: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
17a0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  xpr *pNew;.  pNe
17b0: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
17c0: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29  ( sizeof(Expr) )
17d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
17e0: 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ){.    /* When m
17f0: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c  alloc fails, del
1800: 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ete pLeft and pR
1810: 69 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e  ight. Expression
1820: 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20  s passed to .   
1830: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
1840: 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  n must always be
1850: 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20   allocated with 
1860: 73 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f  sqlite3Expr() fo
1870: 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72  r this .    ** r
1880: 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20  eason. .    */. 
1890: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
18a0: 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  lete(pLeft);.   
18b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18c0: 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20  te(pRight);.    
18d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
18e0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20  pNew->op = op;. 
18f0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
1900: 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  Left;.  pNew->pR
1910: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
1920: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
1930: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
1940: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
1950: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
1960: 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d      pNew->span =
1970: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
1980: 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20  pToken;.  }else 
1990: 69 66 28 20 70 4c 65 66 74 20 26 26 20 70 52 69  if( pLeft && pRi
19a0: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
19b0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
19c0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
19d0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
19e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
19f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
1a00: 64 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70  doing a nested p
1a10: 61 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e  arse, you can in
1a20: 63 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61  clude terms in a
1a30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
1a40: 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74  that look like t
1a50: 68 69 73 3a 20 20 20 23 30 20 23 31 20 23 32 20  his:   #0 #1 #2 
1a60: 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  ...  These terms
1a70: 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e   refer to elemen
1a80: 74 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ts.** on the sta
1a90: 63 6b 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20  ck.  "#0" means 
1aa0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
1ab0: 74 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65  tack..** "#1" me
1ac0: 61 6e 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77  ans the next dow
1ad0: 6e 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  n on the stack. 
1ae0: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   And so forth..*
1af0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b00: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
1b10: 68 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61  he parser to dea
1b20: 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f  l with on of tho
1b30: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20  se terms..** It 
1b40: 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65  immediately gene
1b50: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74  rates code to st
1b60: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
1b70: 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69   a memory locati
1b80: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  on..** The retur
1b90: 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ns an expression
1ba0: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20   that will code 
1bb0: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
1bc0: 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61  alue from.** tha
1bd0: 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  t memory locatio
1be0: 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  n as needed..*/.
1bf0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67  Expr *sqlite3Reg
1c00: 69 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20  isterExpr(Parse 
1c10: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1c20: 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20  pToken){.  Vdbe 
1c30: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1c40: 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  be;.  Expr *p;. 
1c50: 20 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66   int depth;.  if
1c60: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
1c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1c80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c90: 65 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a  e, "near \"%T\":
1ca0: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20   syntax error", 
1cb0: 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74  pToken);.    ret
1cc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1cd0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
1ce0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
1cf0: 78 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c  xpr(TK_REGISTER,
1d00: 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a   0, 0, pToken);.
1d10: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
1d20: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1d30: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
1d40: 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61  .  }.  depth = a
1d50: 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b  toi((char*)&pTok
1d60: 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d 3e  en->z[1]);.  p->
1d70: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
1d80: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nMem++;.  sqlit
1d90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1da0: 50 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30 29  P_Dup, depth, 0)
1db0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
1dd0: 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c 20  ore, p->iTable, 
1de0: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  1);.  return p;.
1df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
1e00: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
1e10: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
1e20: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
1e30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
1e40: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
1e50: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
1e60: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
1e70: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1e80: 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c 65 66  prAnd(Expr *pLef
1e90: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
1ea0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
1eb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1ec0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
1ed0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
1ee0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
1ef0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1f00: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1f10: 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  r(TK_AND, pLeft,
1f20: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1f40: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
1f50: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
1f60: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
1f70: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
1f80: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
1f90: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
1fa0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
1fb0: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
1fc0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
1fd0: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
1fe0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
1ff0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2000: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
2010: 28 20 21 73 71 6c 69 74 65 33 54 73 64 28 29 2d  ( !sqlite3Tsd()-
2020: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
2030: 20 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c   pRight->z && pL
2040: 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 61 73  eft->z ){.    as
2050: 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 64 79 6e  sert( pLeft->dyn
2060: 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a 5b  ==0 || pLeft->z[
2070: 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a  pLeft->n]==0 );.
2080: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64      if( pLeft->d
2090: 79 6e 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d  yn==0 && pRight-
20a0: 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >dyn==0 ){.     
20b0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d   pExpr->span.z =
20c0: 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20   pLeft->z;.     
20d0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
20e0: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70 52   pRight->n + (pR
20f0: 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74 2d  ight->z - pLeft-
2100: 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
2110: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
2120: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  n.z = 0;.    }. 
2130: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
2140: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2150: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
2160: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
2170: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
2180: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
2190: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
21a0: 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ion(ExprList *pL
21b0: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
21c0: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
21d0: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
21e0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
21f0: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
2200: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
2210: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2220: 6c 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20  lete(pList); /* 
2230: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
2240: 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  mory when malloc
2250: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
2260: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
2270: 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43  ew->op = TK_FUNC
2280: 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  TION;.  pNew->pL
2290: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69  ist = pList;.  i
22a0: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
22b0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
22c0: 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70  >dyn==0 );.    p
22d0: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
22e0: 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oken;.  }else{. 
22f0: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
2300: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
2310: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
2320: 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  oken;.  return p
2330: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  New;.}../*.** As
2340: 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20  sign a variable 
2350: 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70  number to an exp
2360: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63  ression that enc
2370: 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a  odes a wildcard.
2380: 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ** in the origin
2390: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
23a0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  .  .**.** Wildca
23b0: 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  rds consisting o
23c0: 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61  f a single "?" a
23d0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
23e0: 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a  next sequential.
23f0: 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  ** variable numb
2400: 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  er..**.** Wildca
2410: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
2420: 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67  "?nnn" are assig
2430: 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22  ned the number "
2440: 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a  nnn".  We make.*
2450: 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20  * sure "nnn" is 
2460: 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76  not too be to av
2470: 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20  oid a denial of 
2480: 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77  service attack w
2490: 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73  hen.** the SQL s
24a0: 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66  tatement comes f
24b0: 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  rom an external 
24c0: 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69  source..**.** Wi
24d0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
24e0: 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24  orm ":aaa" or "$
24f0: 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65  aaa" are assigne
2500: 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  d the same numbe
2510: 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76  r.** as the prev
2520: 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  ious instance of
2530: 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61   the same wildca
2540: 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20  rd.  Or if this 
2550: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
2560: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2570: 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65  wildcard, the ne
2580: 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72  xt sequenial var
2590: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a  iable number is.
25a0: 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a  ** assigned..*/.
25b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
25c0: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
25d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
25e0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54  xpr *pExpr){.  T
25f0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  oken *pToken;.  
2600: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
2610: 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20  eturn;.  pToken 
2620: 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b  = &pExpr->token;
2630: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2640: 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  n->n>=1 );.  ass
2650: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
2660: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2670: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29  Token->z[0]!=0 )
2680: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e  ;.  if( pToken->
2690: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57  n==1 ){.    /* W
26a0: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
26b0: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
26c0: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
26d0: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
26e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
26f0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   ++pParse->nVar;
2700: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
2710: 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29  ken->z[0]=='?' )
2720: 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72  {.    /* Wildcar
2730: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
2740: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
2750: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
2760: 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73  er and.    ** us
2770: 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72 69  e it as the vari
2780: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
2790: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45     int i;.    pE
27a0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20  xpr->iTable = i 
27b0: 3d 20 61 74 6f 69 28 28 63 68 61 72 2a 29 26 70  = atoi((char*)&p
27c0: 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20  Token->z[1]);.  
27d0: 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53    if( i<1 || i>S
27e0: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
27f0: 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20  LE_NUMBER ){.   
2800: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2810: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
2820: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
2830: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
2840: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
2850: 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41     SQLITE_MAX_VA
2860: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a  RIABLE_NUMBER);.
2870: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2880: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a  pParse->nVar ){.
2890: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
28a0: 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  ar = i;.    }.  
28b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69  }else{.    /* Wi
28c0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
28d0: 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24  orm ":aaa" or "$
28e0: 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65  aaa".  Reuse the
28f0: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20   same variable. 
2900: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20     ** number as 
2910: 74 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72  the prior appear
2920: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
2930: 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65   name, or if the
2940: 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73   name.    ** has
2950: 20 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20   never appeared 
2960: 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68  before, reuse th
2970: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20  e same variable 
2980: 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20  number.    */.  
2990: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20    int i, n;.    
29a0: 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20  n = pToken->n;. 
29b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
29c0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20  arse->nVarExpr; 
29d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
29e0: 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20   *pE;.      if( 
29f0: 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70  (pE = pParse->ap
2a00: 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20  VarExpr[i])!=0. 
2a10: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
2a20: 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20  token.n==n.     
2a30: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
2a40: 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b  E->token.z, pTok
2a50: 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  en->z, n)==0 ){.
2a60: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2a70: 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62  Table = pE->iTab
2a80: 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  le;.        brea
2a90: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2aa0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72  .    if( i>=pPar
2ab0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a  se->nVarExpr ){.
2ac0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
2ad0: 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ble = ++pParse->
2ae0: 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20  nVar;.      if( 
2af0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2b00: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
2b10: 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20  prAlloc-1 ){.   
2b20: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
2b30: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50  rExprAlloc += pP
2b40: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
2b50: 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  loc + 10;.      
2b60: 20 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63    sqlite3Realloc
2b70: 4f 72 46 72 65 65 28 28 76 6f 69 64 2a 2a 29 26  OrFree((void**)&
2b80: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2b90: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2ba0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
2bb0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
2bc0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
2bd0: 70 56 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a  pVarExpr[0]) );.
2be0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2bf0: 28 20 21 73 71 6c 69 74 65 33 54 73 64 28 29 2d  ( !sqlite3Tsd()-
2c00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2c10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c20: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
2c30: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
2c40: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
2c50: 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  pr[pParse->nVarE
2c60: 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a  xpr++] = pExpr;.
2c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c80: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75  } .}../*.** Recu
2c90: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
2ca0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2cb0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2cc0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70  e3ExprDelete(Exp
2cd0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
2ce0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
2cf0: 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20  ( p->span.dyn ) 
2d00: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
2d10: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  *)p->span.z);.  
2d20: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  if( p->token.dyn
2d30: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
2d40: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
2d50: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
2d60: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
2d70: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
2d80: 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b  lete(p->pRight);
2d90: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2da0: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73  stDelete(p->pLis
2db0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
2dc0: 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65  ectDelete(p->pSe
2dd0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
2de0: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
2df0: 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20   The Expr.token 
2e00: 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61  field might be a
2e10: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
2e20: 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a  that is quoted..
2e30: 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65  ** If so, remove
2e40: 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d   the quotation m
2e50: 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arks..*/.void sq
2e60: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
2e70: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
2e80: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
2e90: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
2ea0: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
2eb0: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
2ec0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
2ed0: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
2ee0: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
2ef0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
2f00: 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74 6f 6b 65  kenCopy(&p->toke
2f10: 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  n, &p->token);. 
2f20: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
2f30: 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ote((char*)p->to
2f40: 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ken.z);.}.../*.*
2f50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2f60: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
2f70: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
2f80: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
2f90: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
2fa0: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
2fb0: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
2fc0: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
2fd0: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
2fe0: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
2ff0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
3000: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
3010: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
3020: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
3030: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
3040: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
3050: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
3060: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
3070: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
3080: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3090: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
30a0: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
30b0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
30c0: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
30d0: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
30e0: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
30f0: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
3100: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
3110: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
3120: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
3130: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
3140: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
3150: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
3160: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
3170: 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b  xprDup(Expr *p){
3180: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
3190: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
31a0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
31b0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
31c0: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
31d0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
31e0: 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79  turn 0;.  memcpy
31f0: 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66  (pNew, p, sizeof
3200: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
3210: 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b  p->token.z!=0 ){
3220: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
3230: 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  .z = (u8*)sqlite
3240: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
3250: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f  ->token.z, p->to
3260: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77  ken.n);.    pNew
3270: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b  ->token.dyn = 1;
3280: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
3290: 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65  sert( pNew->toke
32a0: 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  n.z==0 );.  }.  
32b0: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  pNew->span.z = 0
32c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
32d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
32e0: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e  (p->pLeft);.  pN
32f0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
3300: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
3310: 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Right);.  pNew->
3320: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
3330: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c  xprListDup(p->pL
3340: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
3350: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
3360: 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c  electDup(p->pSel
3370: 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 54  ect);.  pNew->pT
3380: 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20  ab = p->pTab;.  
3390: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76  return pNew;.}.v
33a0: 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e  oid sqlite3Token
33b0: 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c  Copy(Token *pTo,
33c0: 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a   Token *pFrom){.
33d0: 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29    if( pTo->dyn )
33e0: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
33f0: 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66  r*)pTo->z);.  if
3400: 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20  ( pFrom->z ){.  
3410: 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d    pTo->n = pFrom
3420: 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  ->n;.    pTo->z 
3430: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 53 74 72  = (u8*)sqliteStr
3440: 4e 44 75 70 28 28 63 68 61 72 2a 29 70 46 72 6f  NDup((char*)pFro
3450: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
3460: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
3470: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
3480: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
3490: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
34a0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45  te3ExprListDup(E
34b0: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
34c0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
34d0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
34e0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
34f0: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
3500: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3510: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3520: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3530: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
3540: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3550: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3560: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
3570: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
3580: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
3590: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61  pItem = sqliteMa
35a0: 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73  lloc( p->nExpr*s
35b0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
35c0: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
35d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
35e0: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
35f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
3600: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
3610: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3620: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
3630: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
3640: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
3650: 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b  Expr, *pOldExpr;
3660: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
3670: 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73  r = pNewExpr = s
3680: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
3690: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
36a0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
36b0: 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  f( pOldExpr->spa
36c0: 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78  n.z!=0 && pNewEx
36d0: 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  pr ){.      /* A
36e0: 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70  lways make a cop
36f0: 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f  y of the span fo
3700: 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72  r top-level expr
3710: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
3720: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
3730: 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f  on list.  The lo
3740: 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72  gic in SELECT pr
3750: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65  ocessing that de
3760: 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a  termines.      *
3770: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  * the names of c
3780: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
3790: 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74  sult set needs t
37a0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
37b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
37c0: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45  TokenCopy(&pNewE
37d0: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64  xpr->span, &pOld
37e0: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
37f0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
3800: 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e  NewExpr==0 || pN
3810: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ewExpr->span.z!=
3820: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  0 .            |
3830: 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  | pOldExpr->span
3840: 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  .z==0 || sqlite3
3850: 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Tsd()->mallocFai
3860: 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  led );.    pItem
3870: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
3880: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
3890: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
38a0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
38b0: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
38c0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
38d0: 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d  isAgg = pOldItem
38e0: 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74  ->isAgg;.    pIt
38f0: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
3900: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3910: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
3920: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
3930: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
3940: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
3950: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
3960: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
3970: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3980: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
3990: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
39a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
39b0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
39c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
39d0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
39e0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
39f0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
3a00: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
3a10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
3a20: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
3a30: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
3a40: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
3a50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
3a60: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
3a70: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
3a80: 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  p(SrcList *p){. 
3a90: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
3aa0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
3ab0: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  Byte;.  if( p==0
3ac0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
3ad0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
3ae0: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
3af0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
3b00: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
3b10: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
3b20: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
3b30: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
3b40: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
3b50: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
3b60: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
3b70: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
3b80: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
3b90: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3ba0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
3bb0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
3bc0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
3bd0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3be0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
3bf0: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
3c00: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
3c10: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
3c20: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
3c30: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
3c40: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3c50: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
3c60: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
3c70: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
3c80: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
3c90: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
3ca0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
3cb0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e    pNewItem->join
3cc0: 74 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  type = pOldItem-
3cd0: 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70  >jointype;.    p
3ce0: 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  NewItem->iCursor
3cf0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75   = pOldItem->iCu
3d00: 72 73 6f 72 3b 0a 20 20 20 20 70 54 61 62 20 3d  rsor;.    pTab =
3d10: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
3d20: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62  = pOldItem->pTab
3d30: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29  ;.    if( pTab )
3d40: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  {.      pTab->nR
3d50: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
3d60: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
3d70: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
3d80: 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70  tDup(pOldItem->p
3d90: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65  Select);.    pNe
3da0: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
3db0: 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64  ite3ExprDup(pOld
3dc0: 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
3dd0: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
3de0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
3df0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  Dup(pOldItem->pU
3e00: 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49  sing);.    pNewI
3e10: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70  tem->colUsed = p
3e20: 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  OldItem->colUsed
3e30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3e40: 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73  New;.}.IdList *s
3e50: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
3e60: 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64  IdList *p){.  Id
3e70: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
3e80: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3e90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3ea0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3eb0: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e  cRaw( sizeof(*pN
3ec0: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
3ed0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3ee0: 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70  .  pNew->nId = p
3ef0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
3f00: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
3f10: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3f20: 77 28 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66  w( p->nId*sizeof
3f30: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
3f40: 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b  f( pNew->a==0 ){
3f50: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3f60: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
3f70: 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
3f80: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
3f90: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
3fa0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
3fb0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
3fc0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
3fd0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
3fe0: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
3ff0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
4000: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
4010: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
4020: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
4030: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
4040: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
4050: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
4060: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
4070: 65 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70  ectDup(Select *p
4080: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
4090: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
40a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
40b0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
40c0: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  aw( sizeof(*p) )
40d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
40e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
40f0: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
4100: 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
4110: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
4120: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4130: 44 75 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  Dup(p->pEList);.
4140: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
4150: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
4160: 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65  (p->pSrc);.  pNe
4170: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
4180: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57  te3ExprDup(p->pW
4190: 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  here);.  pNew->p
41a0: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
41b0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
41c0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65  pGroupBy);.  pNe
41d0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  w->pHaving = sql
41e0: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
41f0: 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d  Having);.  pNew-
4200: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
4210: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
4220: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
4230: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
4240: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
4250: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
4260: 75 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  up(p->pPrior);. 
4270: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
4280: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4290: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65  ->pLimit);.  pNe
42a0: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
42b0: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
42c0: 4f 66 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d  Offset);.  pNew-
42d0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
42e0: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
42f0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65  -1;.  pNew->isRe
4300: 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73 52 65  solved = p->isRe
4310: 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e  solved;.  pNew->
4320: 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67  isAgg = p->isAgg
4330: 3b 0a 20 20 70 4e 65 77 2d 3e 75 73 65 73 56 69  ;.  pNew->usesVi
4340: 72 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  rt = 0;.  pNew->
4350: 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20  disallowOrderBy 
4360: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  = 0;.  pNew->pRi
4370: 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 70  ghtmost = 0;.  p
4380: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  New->addrOpenVir
4390: 74 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  t[0] = -1;.  pNe
43a0: 77 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  w->addrOpenVirt[
43b0: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
43c0: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d  >addrOpenVirt[2]
43d0: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
43e0: 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pNew;.}.#else.Se
43f0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
4400: 65 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70  ectDup(Select *p
4410: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
4420: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
4430: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
4440: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
4450: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
4460: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
4470: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
4480: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
4490: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
44a0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
44b0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72  on list..*/.Expr
44c0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
44d0: 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70 72  rListAppend(Expr
44e0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70  List *pList, Exp
44f0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
4500: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70  *pName){.  if( p
4510: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
4520: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
4530: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72  loc( sizeof(Expr
4540: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
4550: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
4560: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
4570: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
4580: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  ( pList->nAlloc=
4590: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
45a0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70  pList->nAlloc<=p
45b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
45c0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
45d0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
45e0: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  int n = pList->n
45f0: 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20  Alloc*2 + 4;.   
4600: 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
4610: 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73  oc(pList->a, n*s
4620: 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
4630: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d  ]));.    if( a==
4640: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
4650: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
4660: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a    pList->a = a;.
4670: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
4680: 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  c = n;.  }.  ass
4690: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
46a0: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
46b0: 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  || pName ){.    
46c0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
46d0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
46e0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
46f0: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
4700: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
4710: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
4720: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
4730: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
4740: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
4750: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
4760: 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72  = pExpr;.  }.  r
4770: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f  eturn pList;..no
4780: 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20  _mem:     .  /* 
4790: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
47a0: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68  mory if malloc h
47b0: 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20  as failed. */.  
47c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
47d0: 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  e(pExpr);.  sqli
47e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
47f0: 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  e(pList);.  retu
4800: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
4810: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
4820: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4830: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4840: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45  ExprListDelete(E
4850: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
4860: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
4870: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
4880: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
4890: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
48a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
48b0: 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73  t->a!=0 || (pLis
48c0: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70  t->nExpr==0 && p
48d0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29  List->nAlloc==0)
48e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
48f0: 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73  ist->nExpr<=pLis
4900: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66  t->nAlloc );.  f
4910: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
4920: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
4930: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
4940: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
4950: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74  e3ExprDelete(pIt
4960: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
4970: 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
4980: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
4990: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
49a0: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
49b0: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
49c0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
49d0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61  ession tree.  Ca
49e0: 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63  ll xFunc for eac
49f0: 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a  h node visited..
4a00: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
4a10: 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e   value from xFun
4a20: 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  c determines whe
4a30: 74 68 65 72 20 74 68 65 20 74 72 65 65 20 77 61  ther the tree wa
4a40: 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a  lk continues..**
4a50: 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75   0 means continu
4a60: 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72  e walking the tr
4a70: 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20  ee.  1 means do 
4a80: 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65  not walk childre
4a90: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72  n.** of the curr
4aa0: 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e  ent node but con
4ab0: 74 69 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69  tinue with sibli
4ac0: 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62  ngs.  2 means ab
4ad0: 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65  andon.** the tre
4ae0: 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c  e walk completel
4af0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  y..**.** The ret
4b00: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  urn value from t
4b10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31  his routine is 1
4b20: 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
4b30: 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64  tree walk.** and
4b40: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a   0 to continue..
4b50: 2a 2a 0a 2a 2a 20 4e 4f 54 49 43 45 3a 20 20 54  **.** NOTICE:  T
4b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
4b70: 20 2a 6e 6f 74 2a 20 64 65 73 63 65 6e 64 20 69   *not* descend i
4b80: 6e 74 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a  nto subqueries..
4b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
4ba0: 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  lkExprList(ExprL
4bb0: 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29 28 76  ist *, int (*)(v
4bc0: 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76  oid *, Expr*), v
4bd0: 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  oid *);.static i
4be0: 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  nt walkExprTree(
4bf0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
4c00: 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c   (*xFunc)(void*,
4c10: 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  Expr*), void *pA
4c20: 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  rg){.  int rc;. 
4c30: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
4c40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
4c50: 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20   (*xFunc)(pArg, 
4c60: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63  pExpr);.  if( rc
4c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ==0 ){.    if( w
4c80: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
4c90: 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c  r->pLeft, xFunc,
4ca0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4cb0: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
4cc0: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
4cd0: 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41  Right, xFunc, pA
4ce0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4cf0: 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72      if( walkExpr
4d00: 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  List(pExpr->pLis
4d10: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  t, xFunc, pArg) 
4d20: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
4d30: 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b 0a 7d    return rc>1;.}
4d40: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c  ../*.** Call wal
4d50: 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72 20  kExprTree() for 
4d60: 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
4d70: 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73   in list p..*/.s
4d80: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
4d90: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
4da0: 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  *p, int (*xFunc)
4db0: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
4dc0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
4dd0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
4de0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
4df0: 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70 20 29  Item;.  if( !p )
4e00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
4e10: 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70 49 74  (i=p->nExpr, pIt
4e20: 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  em=p->a; i>0; i-
4e30: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
4e40: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
4e50: 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
4e60: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
4e70: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
4e80: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4e90: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
4ea0: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
4eb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 53 65  expression in Se
4ec0: 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e 63 6c  lect p, not incl
4ed0: 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73  uding.** express
4ee0: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 70 61  ions that are pa
4ef0: 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74  rt of sub-select
4f00: 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20 63 6c  s in any FROM cl
4f10: 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49 4d 49  ause or the LIMI
4f20: 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54 20 65  T.** or OFFSET e
4f30: 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a  xpressions...*/.
4f40: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 53  static int walkS
4f50: 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65 63 74  electExpr(Select
4f60: 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63   *p, int (*xFunc
4f70: 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29  )(void *, Expr*)
4f80: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
4f90: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
4fa0: 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20  >pEList, xFunc, 
4fb0: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
4fc0: 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72 65 2c  rTree(p->pWhere,
4fd0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
4fe0: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d   walkExprList(p-
4ff0: 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75 6e 63  >pGroupBy, xFunc
5000: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
5010: 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61 76 69  xprTree(p->pHavi
5020: 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ng, xFunc, pArg)
5030: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  ;.  walkExprList
5040: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 78 46  (p->pOrderBy, xF
5050: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 72 65  unc, pArg);.  re
5060: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
5070: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5080: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
5090: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
50a0: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
50b0: 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79 20   pArg is really 
50c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
50d0: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65 20  integer.  If we 
50e0: 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b  can tell by look
50f0: 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72 20  ing.** at pExpr 
5100: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
5110: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
5120: 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 61  s pExpr is not a
5130: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70   constant.** exp
5140: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65  ression, then se
5150: 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e 64  t *pArg to 0 and
5160: 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62 61   return 2 to aba
5170: 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61  ndon the tree wa
5180: 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  lk..** If pExpr 
5190: 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64 69  does does not di
51a0: 73 71 75 61 6c 69 66 79 20 74 68 65 20 65 78 70  squalify the exp
51b0: 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69  ression from bei
51c0: 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ng a constant.**
51d0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
51e0: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61  ..**.** After wa
51f0: 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 20  lking the whole 
5200: 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65  tree, if no node
5210: 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61 74  s are found that
5220: 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74   disqualify.** t
5230: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  he expression as
5240: 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
5250: 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 77 68  we assume the wh
5260: 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ole expression.*
5270: 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20  * is constant.  
5280: 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  See sqlite3ExprI
5290: 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72 20  sConstant() for 
52a0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
52b0: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
52c0: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
52d0: 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a 70  Constant(void *p
52e0: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
52f0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ){.  switch( pEx
5300: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
5310: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
5320: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
5330: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
5340: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
5350: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
5360: 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a 20 20  d *pArg==2 */.  
5370: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
5380: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 2a 28  ON:.      if( *(
5390: 28 69 6e 74 2a 29 70 41 72 67 29 3d 3d 32 20 29  (int*)pArg)==2 )
53a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
53b0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
53c0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
53d0: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
53e0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
53f0: 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73   TK_DOT:.    cas
5400: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
5410: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
5420: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 23 69 66 6e 64  GG_COLUMN:.#ifnd
5430: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5440: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
5450: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
5460: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
5470: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 28 28  #endif.      *((
5480: 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b 0a  int*)pArg) = 0;.
5490: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
54a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
54b0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
54c0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
54d0: 20 20 20 20 2a 28 28 69 6e 74 2a 29 70 41 72 67      *((int*)pArg
54e0: 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  ) = 0;.        r
54f0: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 7d  eturn 2;.      }
5500: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
5510: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5520: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  }.}../*.** Walk 
5530: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
5540: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
5550: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5560: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
5570: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
5580: 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72  ves variables or
5590: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e   function calls.
55a0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
55b0: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
55c0: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
55d0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
55e0: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
55f0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
5600: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
5610: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
5620: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
5630: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
5640: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5650: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45  ExprIsConstant(E
5660: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  xpr *p){.  int i
5670: 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20 77 61  sConst = 1;.  wa
5680: 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65 78  lkExprTree(p, ex
5690: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
56a0: 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72  , &isConst);.  r
56b0: 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d  eturn isConst;.}
56c0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
56d0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
56e0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
56f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5700: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61  constant.** or a
5710: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77   function call w
5720: 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  ith constant arg
5730: 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
5740: 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a  and 0 if there.*
5750: 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61 62  * are any variab
5760: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
5770: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
5780: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
5790: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
57a0: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
57b0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
57c0: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
57d0: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
57e0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
57f0: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
5800: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
5810: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
5820: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ntOrFunction(Exp
5830: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43  r *p){.  int isC
5840: 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77 61 6c 6b  onst = 2;.  walk
5850: 45 78 70 72 54 72 65 65 28 70 2c 20 65 78 70 72  ExprTree(p, expr
5860: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20  NodeIsConstant, 
5870: 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74  &isConst);.  ret
5880: 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d 30 3b 0a  urn isConst!=0;.
5890: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
58a0: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
58b0: 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
58c0: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
58d0: 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
58e0: 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
58f0: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
5900: 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
5910: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
5920: 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
5930: 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
5940: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
5950: 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
5960: 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
5970: 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
5980: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
5990: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
59a0: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
59b0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
59c0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
59d0: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
59e0: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69   *pValue){.  swi
59f0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
5a00: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
5a10: 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  R: {.      if( s
5a20: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 28  qlite3GetInt32((
5a30: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
5a40: 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  , pValue) ){.   
5a50: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5a60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5a70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5a80: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
5a90: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
5aa0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
5ab0: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
5ac0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  e);.    }.    ca
5ad0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
5ae0: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
5af0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
5b00: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
5b10: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
5b20: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
5b30: 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  v;.        retur
5b40: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
5b50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
5b70: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
5b80: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
5b90: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
5ba0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
5bb0: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
5bc0: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
5bd0: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
5be0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
5bf0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5c00: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
5c10: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5c20: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
5c30: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
5c40: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5c50: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
5c60: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
5c70: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
5c80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5c90: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
5ca0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  of a column of t
5cb0: 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  he form X.Y.Z or
5cc0: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20   Y.Z or just Z, 
5cd0: 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20  look up.** that 
5ce0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20  name in the set 
5cf0: 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  of source tables
5d00: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64   in pSrcList and
5d10: 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20   make the pExpr 
5d20: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  .** expression n
5d30: 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74  ode refer back t
5d40: 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f  o that source co
5d50: 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  lumn.  The follo
5d60: 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20  wing changes.** 
5d70: 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70  are made to pExp
5d80: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70  r:.**.**    pExp
5d90: 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20  r->iDb          
5da0: 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69   Set the index i
5db0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74  n db->aDb[] of t
5dc0: 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  he database hold
5dd0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
5df0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
5e00: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20  pExpr->iTable   
5e10: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
5e20: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
5e30: 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61  r the table obta
5e40: 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ined.**         
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a  from pSrcList..*
5e70: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  *    pExpr->iCol
5e80: 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f  umn       Set to
5e90: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
5ea0: 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  er within the ta
5eb0: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
5ec0: 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
5ed0: 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  Set to TK_COLUMN
5ee0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
5ef0: 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79  Left         Any
5f00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
5f10: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
5f20: 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70  leted.**    pExp
5f30: 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20  r->pRight       
5f40: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
5f50: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
5f60: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
5f70: 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73   The pDbToken is
5f80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5f90: 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22   database (the "
5fa0: 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65  X").  This value
5fb0: 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20   may be.** NULL 
5fc0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d  meaning that nam
5fd0: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
5fe0: 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20   Y.Z or Z.  Any 
5ff0: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
6000: 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  se.** can be use
6010: 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f  d.  The pTableTo
6020: 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ken is the name 
6030: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68  of the table (th
6040: 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a  e "Y").  This.**
6050: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55   value can be NU
6060: 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69  LL if pDbToken i
6070: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66  s also NULL.  If
6080: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20   pTableToken is 
6090: 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  NULL it.** means
60a0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f   that the form o
60b0: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20  f the name is Z 
60c0: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73  and that columns
60d0: 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a   from any table.
60e0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  ** can be used..
60f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d  **.** If the nam
6100: 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f  e cannot be reso
6110: 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73  lved unambiguous
6120: 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ly, leave an err
6130: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
6140: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
6150: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65  rn non-zero.  Re
6160: 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63  turn zero on suc
6170: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
6180: 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a  int lookupName(.
6190: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
61a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
61b0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
61c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b  .  Token *pDbTok
61d0: 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  en,     /* Name 
61e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
61f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
6200: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
6210: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65  oken *pTableToke
6220: 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  n,  /* Name of t
6230: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
6240: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20  column, or NULL 
6250: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c  */.  Token *pCol
6260: 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d  umnToken, /* Nam
6270: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
6280: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
6290: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68  t *pNC,    /* Th
62a0: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75  e name context u
62b0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  sed to resolve t
62c0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  he name */.  Exp
62d0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
62e0: 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45    /* Make this E
62f0: 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74  XPR node point t
6300: 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  o the selected c
6310: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68  olumn */.){.  ch
6320: 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20  ar *zDb = 0;    
6330: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6340: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
6350: 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f   "X" in X.Y.Z */
6360: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  .  char *zTab = 
6370: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
6380: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
6390: 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20  he "Y" in X.Y.Z 
63a0: 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72  or Y.Z */.  char
63b0: 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20   *zCol = 0;     
63c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
63d0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22  column.  The "Z"
63e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
63f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6400: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
6410: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
6420: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6430: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
6440: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  mn names */.  in
6450: 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20  t cntTab = 0;   
6460: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6470: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e  matching table n
6480: 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ames */.  sqlite
6490: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
64a0: 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
64b0: 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  base */.  struct
64c0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
64d0: 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55  Item;       /* U
64e0: 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  se for looping o
64f0: 76 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65  ver pSrcList ite
6500: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ms */.  struct S
6510: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61  rcList_item *pMa
6520: 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65  tch = 0;  /* The
6530: 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69   matching pSrcLi
6540: 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d  st item */.  Nam
6550: 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43  eContext *pTopNC
6560: 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f   = pNC;        /
6570: 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74  * First namecont
6580: 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ext in the list 
6590: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
65a0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43  olumnToken && pC
65b0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b  olumnToken->z );
65c0: 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59   /* The Z in X.Y
65d0: 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  .Z cannot be NUL
65e0: 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c  L */.  zDb = sql
65f0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
6600: 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a  n(pDbToken);.  z
6610: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Tab = sqlite3Nam
6620: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c  eFromToken(pTabl
6630: 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20  eToken);.  zCol 
6640: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
6650: 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f  mToken(pColumnTo
6660: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ken);.  if( sqli
6670: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
6680: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
6690: 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  to lookupname_en
66a0: 64 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d  d;.  }..  pExpr-
66b0: 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20  >iTable = -1;.  
66c0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e  while( pNC && cn
66d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  t==0 ){.    Expr
66e0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
66f0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
6700: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
6710: 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ist;..    if( pS
6720: 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
6730: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
6740: 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53  SrcList->a; i<pS
6750: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
6760: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
6770: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
6780: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
6790: 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a          Column *
67a0: 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20  pCol;.  .       
67b0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63   if( pTab==0 ) c
67c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
67d0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
67e0: 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Col>0 );.       
67f0: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
6800: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
6810: 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
6820: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6830: 61 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  abName = pItem->
6840: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
6850: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
6860: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
6870: 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74   zTab)!=0 ) cont
6880: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
6890: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
68a0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
68b0: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
68c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
68d0: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
68e0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
68f0: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
6900: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
6910: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44            if( zD
6920: 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  b!=0 && sqlite3S
6930: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 70  trICmp(db->aDb[p
6940: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c  Tab->iDb].zName,
6950: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
6960: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6970: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6980: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
6990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
69a0: 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b  if( 0==(cntTab++
69b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
69c0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
69d0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
69e0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
69f0: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
6a00: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
6a10: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
6a20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
6a30: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
6a40: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
6a50: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
6a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6a70: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6a80: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
6a90: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
6aa0: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73       IdList *pUs
6ab0: 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ing;.           
6ac0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
6ad0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6ae0: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
6af0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
6b00: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
6b20: 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  r->iDb = pTab->i
6b30: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db;.            
6b40: 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68  /* Substitute th
6b50: 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20  e rowid (column 
6b60: 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45  -1) for the INTE
6b70: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
6b80: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
6b90: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
6ba0: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f  j==pTab->iPKey ?
6bb0: 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20   -1 : j;.       
6bc0: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
6bd0: 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nity = pTab->aCo
6be0: 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  l[j].affinity;. 
6bf0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6c00: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e  ->pColl = pTab->
6c10: 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20  aCol[j].pColl;. 
6c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
6c30: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
6c40: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c60: 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63  If this match oc
6c70: 63 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65  curred in the le
6c80: 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61  ft table of a na
6c90: 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20  tural join,.    
6ca0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
6cb0: 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67 68 74  n skip the right
6cc0: 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20   table to avoid 
6cd0: 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63  a duplicate matc
6ce0: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
6cf0: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20     pItem++;.    
6d00: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
6d10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6d20: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55           if( (pU
6d30: 73 69 6e 67 20 3d 20 70 49 74 65 6d 2d 3e 70 55  sing = pItem->pU
6d40: 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  sing)!=0 ){.    
6d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
6d60: 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72  this match occur
6d70: 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68  s on a column th
6d80: 61 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49  at is in the USI
6d90: 4e 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  NG clause.      
6da0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
6db0: 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73  join, skip the s
6dc0: 65 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67  earch of the rig
6dd0: 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ht table of the 
6de0: 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  join.           
6df0: 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61     ** to avoid a
6e00: 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68   duplicate match
6e10: 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20   there. */.     
6e20: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
6e40: 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d  r(k=0; k<pUsing-
6e50: 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  >nId; k++){.    
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6e70: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
6e80: 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d  Using->a[k].zNam
6e90: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6eb0: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
6ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6ef0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6f00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6f40: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6f50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6f60: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
6f70: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
6f80: 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f  not already reso
6f90: 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74  lved the name, t
6fa0: 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a  hen maybe .    *
6fb0: 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20  * it is a new.* 
6fc0: 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72  or old.* trigger
6fd0: 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65   argument refere
6fe0: 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nce.    */.    i
6ff0: 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61  f( zDb==0 && zTa
7000: 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26  b!=0 && cnt==0 &
7010: 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  & pParse->trigSt
7020: 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack!=0 ){.      
7030: 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54  TriggerStack *pT
7040: 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50  riggerStack = pP
7050: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b  arse->trigStack;
7060: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
7070: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ab = 0;.      if
7080: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
7090: 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26  >newIdx != -1 &&
70a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
70b0: 22 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20  "new", zTab) == 
70c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
70d0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72  pr->iTable = pTr
70e0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49  iggerStack->newI
70f0: 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  dx;.        asse
7100: 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63  rt( pTriggerStac
7110: 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20  k->pTab );.     
7120: 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67     pTab = pTrigg
7130: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20  erStack->pTab;. 
7140: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
7150: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
7160: 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  dIdx != -1 && sq
7170: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c  lite3StrICmp("ol
7180: 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a  d", zTab)==0 ){.
7190: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
71a0: 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72  Table = pTrigger
71b0: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20  Stack->oldIdx;. 
71c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
71d0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
71e0: 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ab );.        pT
71f0: 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  ab = pTriggerSta
7200: 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ck->pTab;.      
7210: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
7220: 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e  b ){ .        in
7230: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  t j;.        Col
7240: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62  umn *pCol = pTab
7250: 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ->aCol;..       
7260: 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54   pExpr->iDb = pT
7270: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20  ab->iDb;.       
7280: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
7290: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20     for(j=0; j < 
72a0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
72b0: 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20   pCol++) {.     
72c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
72d0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
72e0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
72f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
7300: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
7310: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
7320: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
7330: 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20  ? -1 : j;.      
7340: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
7350: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
7360: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
7370: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7380: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d  r->pColl = pTab-
7390: 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a  >aCol[j].pColl;.
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
73b0: 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  r->pTab = pTab;.
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
73d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
73e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
73f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
7400: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7410: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
7420: 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  /..    /*.    **
7430: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
7440: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
7450: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
7460: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
7470: 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31  ==0 && cntTab==1
7480: 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77   && sqlite3IsRow
7490: 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20  id(zCol) ){.    
74a0: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
74b0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
74c0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70  = -1;.      pExp
74d0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  r->affinity = SQ
74e0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
74f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
7500: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e      ** If the in
7510: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
7520: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
7530: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
7540: 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d   name Z.    ** m
7550: 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e  ight refer to an
7560: 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61   result-set alia
7570: 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  s.  This happens
7580: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
7590: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72  hen.    ** we ar
75a0: 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65  e resolving name
75b0: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
75c0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  lause of the fol
75d0: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a  lowing command:.
75e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
75f0: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
7600: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45  x FROM table WHE
7610: 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a  RE x<10;.    **.
7620: 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20      ** In cases 
7630: 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61  like this, repla
7640: 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20  ce pExpr with a 
7650: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
7660: 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20  ession that.    
7670: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73  ** forms the res
7680: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22  ult set entry ("
7690: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d  a+b" in the exam
76a0: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ple) and return 
76b0: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
76c0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
76d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
76e0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
76f0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
7700: 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72  dy been.    ** r
7710: 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74  esolved by the t
7720: 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ime the WHERE cl
7730: 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64  ause is resolved
7740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
7750: 20 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69   cnt==0 && (pELi
7760: 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
7770: 29 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  )!=0 && zTab==0 
7780: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
7790: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
77a0: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
77b0: 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c   char *zAs = pEL
77c0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
77d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73  .        if( zAs
77e0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
77f0: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
7800: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7810: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7820: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
7830: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
7840: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7850: 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20  >op = TK_AS;.   
7860: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
7870: 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
7880: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
7890: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
78a0: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  up(pEList->a[j].
78b0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
78c0: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
78d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61       assert( zTa
78e0: 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29  b==0 && zDb==0 )
78f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
7900: 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f   lookupname_end_
7910: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
7920: 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20     } .    }..   
7930: 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
7940: 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e  he next name con
7950: 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20  text.  The loop 
7960: 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65  will exit when e
7970: 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20  ither.    ** we 
7980: 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e  have a match (cn
7990: 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20  t>0) or when we 
79a0: 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20  run out of name 
79b0: 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f  contexts..    */
79c0: 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  .    if( cnt==0 
79d0: 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70  ){.      pNC = p
79e0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  NC->pNext;.    }
79f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
7a00: 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e  If X and Y are N
7a10: 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ULL (in other wo
7a20: 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20  rds if only the 
7a30: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73  column name Z is
7a40: 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20  .  ** supplied) 
7a50: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
7a60: 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69   Z is enclosed i
7a70: 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c  n double-quotes,
7a80: 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20   then.  ** Z is 
7a90: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
7aa0: 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d   if it doesn't m
7ab0: 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  atch any column 
7ac0: 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a  names.  In that.
7ad0: 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65    ** case, we ne
7ae0: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67  ed to return rig
7af0: 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20  ht away and not 
7b00: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
7b10: 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a   to.  ** pExpr..
7b20: 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73    **.  ** Becaus
7b30: 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  e no reference w
7b40: 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72  as made to outer
7b50: 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70   contexts, the p
7b60: 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69  NC->nRef.  ** fi
7b70: 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61  elds are not cha
7b80: 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74  nged in any cont
7b90: 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ext..  */.  if( 
7ba0: 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d  cnt==0 && zTab==
7bb0: 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  0 && pColumnToke
7bc0: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a  n->z[0]=='"' ){.
7bd0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
7be0: 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Col);.    return
7bf0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   0;.  }..  /*.  
7c00: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
7c10: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
7c20: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
7c30: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
7c40: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
7c50: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
7c60: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
7c70: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
7c80: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
7c90: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
7ca0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
7cb0: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
7cc0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
7cd0: 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75   %s" : "ambiguou
7ce0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  s column name: %
7cf0: 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  s";.    if( zDb 
7d00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7d10: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44  SetString(&z, zD
7d20: 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e  b, ".", zTab, ".
7d30: 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29  ", zCol, (char*)
7d40: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
7d50: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
7d60: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
7d70: 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  (&z, zTab, ".", 
7d80: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
7d90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7da0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 44    z = sqliteStrD
7db0: 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  up(zCol);.    }.
7dc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7dd0: 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72  Msg(pParse, zErr
7de0: 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
7df0: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f  Free(z);.    pTo
7e00: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  pNC->nErr++;.  }
7e10: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75  ..  /* If a colu
7e20: 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  mn from a table 
7e30: 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72  in pSrcList is r
7e40: 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20  eferenced, then 
7e50: 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73  record.  ** this
7e60: 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72   fact in the pSr
7e70: 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65  cList.a[].colUse
7e80: 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75  d bitmask.  Colu
7e90: 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a  mn 0 causes.  **
7ea0: 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74   bit 0 to be set
7eb0: 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73  .  Column 1 sets
7ec0: 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20   bit 1.  And so 
7ed0: 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20  forth.  If the. 
7ee0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   ** column numbe
7ef0: 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
7f00: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7f10: 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d  bits in the bitm
7f20: 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65  ask.  ** then se
7f30: 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72  t the high-order
7f40: 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d   bit of the bitm
7f50: 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask..  */.  if( 
7f60: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
7f70: 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29  0 && pMatch!=0 )
7f80: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
7f90: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
7fa0: 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28    if( n>=sizeof(
7fb0: 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20  Bitmask)*8 ){.  
7fc0: 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42      n = sizeof(B
7fd0: 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20  itmask)*8-1;.   
7fe0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
7ff0: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d  Match->iCursor==
8000: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
8010: 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c  .    pMatch->col
8020: 55 73 65 64 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20  Used |= 1<<n;.  
8030: 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  }..lookupname_en
8040: 64 3a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  d:.  /* Clean up
8050: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
8060: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44  .  sqliteFree(zD
8070: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
8080: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
8090: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
80a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78  r->pLeft);.  pEx
80b0: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
80c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
80d0: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
80e0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
80f0: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
8100: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
8110: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f  .lookupname_end_
8120: 32 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  2:.  sqliteFree(
8130: 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74  zCol);.  if( cnt
8140: 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==1 ){.    asser
8150: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  t( pNC!=0 );.   
8160: 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64   sqlite3AuthRead
8170: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
8180: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a  pNC->pSrcList);.
8190: 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 26      if( pMatch &
81a0: 26 20 21 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65  & !pMatch->pSele
81b0: 63 74 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  ct ){.      pExp
81c0: 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61 74 63 68  r->pTab = pMatch
81d0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  ->pTab;.    }.  
81e0: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
81f0: 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e  he nRef value on
8200: 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78   all name contex
8210: 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70  ts from TopNC up
8220: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   to.    ** the p
8230: 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e  oint where the n
8240: 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a  ame matched. */.
8250: 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
8260: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e     assert( pTopN
8270: 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  C!=0 );.      pT
8280: 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  opNC->nRef++;.  
8290: 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d      if( pTopNC==
82a0: 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pNC ) break;.   
82b0: 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70     pTopNC = pTop
82c0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  NC->pNext;.    }
82d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
82e0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
82f0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
8300: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8310: 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73  e is designed as
8320: 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
8330: 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a  lkExprTree()..**
8340: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d 62  .** Resolve symb
8350: 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20  olic names into 
8360: 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74  TK_COLUMN operat
8370: 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  ors for the curr
8380: 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74  ent.** node in t
8390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
83a0: 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74 6f  ee.  Return 0 to
83b0: 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65   continue the se
83c0: 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65  arch down.** the
83d0: 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61 62   tree or 2 to ab
83e0: 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61 6c  ort the tree wal
83f0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
8400: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
8410: 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 61  error checking a
8420: 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  nd name resoluti
8430: 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69  on for.** functi
8440: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f  on names.  The o
8450: 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67 72  perator for aggr
8460: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
8470: 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f  is changed.** to
8480: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
8490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
84a0: 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70  nameResolverStep
84b0: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
84c0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d  r *pExpr){.  Nam
84d0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
84e0: 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41  (NameContext*)pA
84f0: 72 67 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rg;.  SrcList *p
8500: 53 72 63 4c 69 73 74 3b 0a 20 20 50 61 72 73 65  SrcList;.  Parse
8510: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
8520: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
8530: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
8540: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 53 72 63  pNC!=0 );.  pSrc
8550: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
8560: 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 20 3d  List;.  pParse =
8570: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pNC->pParse;.. 
8580: 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50   if( ExprHasAnyP
8590: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
85a0: 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72 65  P_Resolved) ) re
85b0: 74 75 72 6e 20 31 3b 0a 20 20 45 78 70 72 53 65  turn 1;.  ExprSe
85c0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
85d0: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23   EP_Resolved);.#
85e0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
85f0: 69 66 28 20 70 53 72 63 4c 69 73 74 20 26 26 20  if( pSrcList && 
8600: 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  pSrcList->nAlloc
8610: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  >0 ){.    int i;
8620: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8630: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
8640: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
8650: 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b  rt( pSrcList->a[
8660: 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26  i].iCursor>=0 &&
8670: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
8680: 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e  iCursor<pParse->
8690: 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nTab);.    }.  }
86a0: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
86b0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
86c0: 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f     /* Double-quo
86d0: 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a  ted strings (ex:
86e0: 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64   "abc") are used
86f0: 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20   as identifiers 
8700: 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  if.    ** possib
8710: 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  le.  Otherwise t
8720: 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74  hey remain as st
8730: 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71  rings.  Single-q
8740: 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72  uoted.    ** str
8750: 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29  ings (ex: 'abc')
8760: 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69   are always stri
8770: 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20  ng literals..   
8780: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
8790: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
87a0: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
87b0: 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72  .z[0]=='\'' ) br
87c0: 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  eak;.      /* Fa
87d0: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
87e0: 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74   TK_ID case if t
87f0: 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d  his is a double-
8800: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f  quoted string */
8810: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20  .    }.    /* A 
8820: 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20  lone identifier 
8830: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
8840: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
8850: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20      case TK_ID: 
8860: 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  {.      lookupNa
8870: 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  me(pParse, 0, 0,
8880: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20   &pExpr->token, 
8890: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
88a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
88b0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74   }.  .    /* A t
88c0: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f  able name and co
88d0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49  lumn name:     I
88e0: 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61  D.ID.    ** Or a
88f0: 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65   database, table
8900: 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44   and column:  ID
8910: 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20  .ID.ID.    */.  
8920: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b    case TK_DOT: {
8930: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43  .      Token *pC
8940: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b  olumn;.      Tok
8950: 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20  en *pTable;.    
8960: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20    Token *pDb;.  
8970: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
8980: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20  ;..      /* if( 
8990: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72  pSrcList==0 ) br
89a0: 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52  eak; */.      pR
89b0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
89c0: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
89d0: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
89e0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  D ){.        pDb
89f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
8a00: 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70  able = &pExpr->p
8a10: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
8a20: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
8a30: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
8a40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8a50: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
8a60: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ht->op==TK_DOT )
8a70: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  ;.        pDb = 
8a80: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
8a90: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  oken;.        pT
8aa0: 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e  able = &pRight->
8ab0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
8ac0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
8ad0: 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d  &pRight->pRight-
8ae0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  >token;.      }.
8af0: 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65        lookupName
8b00: 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54  (pParse, pDb, pT
8b10: 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70  able, pColumn, p
8b20: 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  NC, pExpr);.    
8b30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
8b40: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76  }..    /* Resolv
8b50: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  e function names
8b60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8b70: 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
8b80: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
8b90: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
8ba0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
8bb0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20  pExpr->pList;   
8bc0: 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
8bd0: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
8be0: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70  nt n = pList ? p
8bf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
8c00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
8c10: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
8c20: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
8c30: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
8c40: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
8c50: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
8c60: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72   */.      int wr
8c70: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30  ong_num_args = 0
8c80: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8c90: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
8ca0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8cb0: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
8cc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8cd0: 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e  /* True if is an
8ce0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8cf0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
8d00: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   i;.      int nI
8d10: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8d20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8d30: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
8d40: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
8d50: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
8d60: 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20  ar *zId;        
8d70: 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
8d80: 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  ion name. */.   
8d90: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
8da0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8db0: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
8dc0: 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  out the function
8dd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e   */.      int en
8de0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
8df0: 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  enc;  /* The dat
8e00: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a  abase encoding *
8e10: 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 28  /..      zId = (
8e20: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
8e30: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20  en.z;.      nId 
8e40: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
8e50: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
8e60: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
8e70: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
8e80: 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c  Id, nId, n, enc,
8e90: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
8ea0: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
8eb0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
8ec0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
8ed0: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
8ee0: 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a  d, -1, enc, 0);.
8ef0: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
8f00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8f10: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
8f20: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
8f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e  {.          wron
8f40: 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a  g_num_args = 1;.
8f50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
8f70: 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46  s_agg = pDef->xF
8f80: 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a  unc==0;.      }.
8f90: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
8fa0: 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41   && !pNC->allowA
8fb0: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gg ){.        sq
8fc0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8fd0: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
8fe0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8ff0: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  ion %.*s()", nId
9000: 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70  ,zId);.        p
9010: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
9020: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a      is_agg = 0;.
9030: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9040: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a  no_such_func ){.
9050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9060: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9070: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
9080: 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a  n: %.*s", nId, z
9090: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
90a0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
90b0: 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f  }else if( wrong_
90c0: 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  num_args ){.    
90d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
90e0: 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e  Msg(pParse,"wron
90f0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
9100: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
9110: 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20  n %.*s()",.     
9120: 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64          nId, zId
9130: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
9140: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nErr++;.      }.
9150: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
9160: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
9170: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46  r->op = TK_AGG_F
9180: 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20  UNCTION;.       
9190: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31   pNC->hasAgg = 1
91a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
91b0: 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43  if( is_agg ) pNC
91c0: 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a  ->allowAgg = 0;.
91d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
91e0: 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 69  NC->nErr==0 && i
91f0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
9200: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
9210: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
9220: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
9230: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20  ep, pNC);.      
9240: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
9250: 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41  gg ) pNC->allowA
9260: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  gg = 1;.      /*
9270: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74   FIX ME:  Comput
9280: 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  e pExpr->affinit
9290: 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  y based on the e
92a0: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20  xpected return. 
92b0: 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20       ** type of 
92c0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20  the function .  
92d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
92e0: 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20 20 20  urn is_agg;.    
92f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
9300: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
9310: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
9320: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  T:.    case TK_E
9330: 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20  XISTS:.#endif.  
9340: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
9350: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
9360: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
9370: 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70      int nRef = p
9380: 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e 64 65  NC->nRef;.#ifnde
9390: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
93a0: 45 43 4b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ECK.        if( 
93b0: 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a  pNC->isCheck ){.
93c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
93d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
93e0: 2c 22 73 75 62 71 75 65 72 69 65 73 20 70 72 6f  ,"subqueries pro
93f0: 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b  hibited in CHECK
9400: 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a   constraints");.
9410: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
9420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9430: 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
9440: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
9450: 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20 20 20  lect, pNC);.    
9460: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d      assert( pNC-
9470: 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20  >nRef>=nRef );. 
9480: 20 20 20 20 20 20 20 69 66 28 20 6e 52 65 66 21         if( nRef!
9490: 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20  =pNC->nRef ){.  
94a0: 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
94b0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
94c0: 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20  P_VarSelect);.  
94d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
94e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
94f0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
9500: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20  E_OMIT_CHECK.   
9510: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
9520: 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E: {.      if( p
9530: 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20  NC->isCheck ){. 
9540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9550: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 70  rorMsg(pParse,"p
9560: 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68 69 62  arameters prohib
9570: 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63 6f  ited in CHECK co
9580: 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
9590: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
95a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
95b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
95c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
95d0: 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78  tine walks an ex
95e0: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
95f0: 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72  d resolves refer
9600: 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c  ences to.** tabl
9610: 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65  e columns.  Node
9620: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44  s of the form ID
9630: 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76  .ID or ID resolv
9640: 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64  e into an.** ind
9650: 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ex to the table 
9660: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
9670: 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f  t and a column o
9680: 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20  ffset.  The .** 
9690: 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20  Expr.opcode for 
96a0: 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68  such nodes is ch
96b0: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
96c0: 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54  MN.  The Expr.iT
96d0: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73  able.** value is
96e0: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20   changed to the 
96f0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 66  index of the ref
9700: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e  erenced table in
9710: 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75   pTabList.** plu
9720: 73 20 74 68 65 20 22 62 61 73 65 22 20 76 61 6c  s the "base" val
9730: 75 65 2e 20 20 54 68 65 20 62 61 73 65 20 76 61  ue.  The base va
9740: 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  lue will ultimat
9750: 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a  ely become the.*
9760: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
9770: 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72 73 6f  mber for a curso
9780: 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
9790: 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66 65  ng into the refe
97a0: 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e  renced.** table.
97b0: 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75    The Expr.iColu
97c0: 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  mn value is chan
97d0: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
97e0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a   of the column .
97f0: 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ** of the refere
9800: 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68 65  nced table.  The
9810: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
9820: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70 65 63  lue for the spec
9830: 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c  ial.** ROWID col
9840: 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79 20  umn is -1.  Any 
9850: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9860: 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72  KEY column is tr
9870: 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69  ied as an.** ali
9880: 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a  as for ROWID..**
9890: 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f 6c 76 65  .** Also resolve
98a0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20   function names 
98b0: 61 6e 64 20 63 68 65 63 6b 20 74 68 65 20 66 75  and check the fu
98c0: 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70 72 6f 70  nctions for prop
98d0: 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20 20 4d 61  er.** usage.  Ma
98e0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 66 75 6e 63  ke sure all func
98f0: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20 72  tion names are r
9900: 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c  ecognized and al
9910: 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68  l functions.** h
9920: 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  ave the correct 
9930: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
9940: 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e 20 65  nts.  Leave an e
9950: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
9960: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
9970: 73 67 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  sg if anything i
9980: 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75 72 6e  s amiss.  Return
9990: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
99a0: 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
99b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
99c0: 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74  ontains aggregat
99d0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e  e functions then
99e0: 20 73 65 74 20 74 68 65 20 45 50 5f 41 67 67 0a   set the EP_Agg.
99f0: 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 74  ** property on t
9a00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
9a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
9a20: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 0a 20  rResolveNames(. 
9a30: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
9a40: 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  C,       /* Name
9a50: 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65  space to resolve
9a60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e   expressions in.
9a70: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
9a80: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
9a90: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
9aa0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20  to be analyzed. 
9ab0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76 65  */.){.  int save
9ac0: 64 48 61 73 41 67 67 3b 0a 20 20 69 66 28 20 70  dHasAgg;.  if( p
9ad0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
9ae0: 20 30 3b 0a 20 20 73 61 76 65 64 48 61 73 41 67   0;.  savedHasAg
9af0: 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67 67 3b  g = pNC->hasAgg;
9b00: 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d  .  pNC->hasAgg =
9b10: 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   0;.  walkExprTr
9b20: 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  ee(pExpr, nameRe
9b30: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
9b40: 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72  ;.  if( pNC->nEr
9b50: 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53  r>0 ){.    ExprS
9b60: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
9b70: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d  , EP_Error);.  }
9b80: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41  .  if( pNC->hasA
9b90: 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  gg ){.    ExprSe
9ba0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
9bb0: 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73   EP_Agg);.  }els
9bc0: 65 20 69 66 28 20 73 61 76 65 64 48 61 73 41 67  e if( savedHasAg
9bd0: 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61  g ){.    pNC->ha
9be0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  sAgg = 1;.  }.  
9bf0: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
9c00: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
9c10: 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _Error);.}../*.*
9c20: 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74  * A pointer inst
9c30: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
9c40: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
9c50: 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69  o pass informati
9c60: 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61  on.** through wa
9c70: 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20  lkExprTree into 
9c80: 63 6f 64 65 53 75 62 71 75 65 72 79 53 74 65 70  codeSubqueryStep
9c90: 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ()..*/.typedef s
9ca0: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
9cb0: 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72   QueryCoder;.str
9cc0: 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b  uct QueryCoder {
9cd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9ce0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
9cf0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9d00: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
9d10: 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65  *pNC;    /* Name
9d20: 73 70 61 63 65 20 6f 66 20 66 69 72 73 74 20 65  space of first e
9d30: 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a  nclosing query *
9d40: 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  /.};.../*.** Gen
9d50: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
9d60: 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
9d70: 20 75 73 65 64 20 61 73 20 61 6e 20 65 78 70 72   used as an expr
9d80: 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 49 4e  ession.** and IN
9d90: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
9da0: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
9db0: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
9dc0: 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
9dd0: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
9de0: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
9df0: 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
9e00: 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
9e10: 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
9e20: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
9e30: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
9e40: 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
9e50: 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
9e60: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
9e70: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
9e80: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
9e90: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
9ea0: 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
9eb0: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
9ec0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
9ed0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
9ee0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
9ef0: 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
9f00: 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64  bquery..*/.#ifnd
9f10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
9f20: 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c  UBQUERY.void sql
9f30: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
9f40: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
9f50: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
9f60: 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20   int testAddr = 
9f70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
9f90: 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
9fa0: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
9fb0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
9fc0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
9fd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
9fe0: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
9ff0: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
a000: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
a010: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
a020: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
a030: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
a040: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
a050: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
a060: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
a070: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
a080: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
a090: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
a0a0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
a0b0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
a0c0: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
a0d0: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
a0e0: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
a0f0: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
a100: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
a110: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
a120: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
a130: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
a140: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
a150: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
a160: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
a170: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
a180: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
a190: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
a1a0: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
a1b0: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
a1c0: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
a1d0: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
a1e0: 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73   int mem = pPars
a1f0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
a200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a210: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d  v, OP_MemLoad, m
a220: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  em, 0);.    test
a230: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
a240: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
a250: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  , 0, 0);.    ass
a260: 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20  ert( testAddr>0 
a270: 7c 7c 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d  || sqlite3Tsd()-
a280: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
a290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a2a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
a2b0: 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 7d  nt, 1, mem);.  }
a2c0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
a2d0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
a2e0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
a2f0: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
a300: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65        KeyInfo ke
a310: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74  yInfo;.      int
a320: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a   addr;        /*
a330: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
a340: 70 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72  penVirtual instr
a350: 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20  uction */..     
a360: 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69   affinity = sqli
a370: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
a380: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a  pExpr->pLeft);..
a390: 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
a3a0: 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49   this is an 'x I
a3b0: 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72  N(SELECT...)' or
a3c0: 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c   an 'x IN(<exprl
a3d0: 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20  ist>)'.      ** 
a3e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73  expression it is
a3f0: 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d   handled the sam
a400: 65 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c  e way. A virtual
a410: 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20   table is .     
a420: 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20   ** filled with 
a430: 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64  single-field ind
a440: 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e  ex keys represen
a450: 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
a460: 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
a470: 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65  he SELECT or the
a480: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20   <exprlist>..   
a490: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
a4a0: 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73  f the 'x' expres
a4b0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
a4c0: 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53   value, or the S
a4d0: 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a  ELECT....      *
a4e0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  * statement retu
a4f0: 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c  rns a column val
a500: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  ue, then the aff
a510: 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20  inity of that.  
a520: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73      ** column is
a530: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74   used to build t
a540: 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  he index keys. I
a550: 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74  f both 'x' and t
a560: 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  he.      ** SELE
a570: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
a580: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
a590: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
a5a0: 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20  ty is used.     
a5b0: 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f   ** if either co
a5c0: 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43  lumn has NUMERIC
a5d0: 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69   or INTEGER affi
a5e0: 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72  nity. If neither
a5f0: 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f  .      ** 'x' no
a600: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20  r the SELECT... 
a610: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
a620: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
a630: 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ric affinity.   
a640: 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20     ** is used.. 
a650: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
a660: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
a670: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
a680: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
a690: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a6a0: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70  P_OpenVirtual, p
a6b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
a6c0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
a6d0: 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  keyInfo, 0, size
a6e0: 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20  of(keyInfo));.  
a6f0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65      keyInfo.nFie
a700: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ld = 1;.      sq
a710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a720: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
a730: 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ns, pExpr->iTabl
a740: 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  e, 1);..      if
a750: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
a760: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
a770: 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20  ase 1:     expr 
a780: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
a790: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
a7a0: 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63     ** Generate c
a7b0: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
a7c0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
a7d0: 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20  select into the 
a7e0: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
a7f0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63    ** table alloc
a800: 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
a810: 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
a820: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50  /.        int iP
a830: 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  arm = pExpr->iTa
a840: 62 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66  ble +  (((int)af
a850: 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20  finity)<<16);.  
a860: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
a870: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
a880: 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
a890: 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
a8a0: 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
a8b0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
a8c0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
a8d0: 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  e, pExpr->pSelec
a8e0: 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61 72  t, SRT_Set, iPar
a8f0: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  m, 0, 0, 0, 0);.
a900: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d          pEList =
a910: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d   pExpr->pSelect-
a920: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  >pEList;.       
a930: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
a940: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
a950: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79  { .          key
a960: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
a970: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  binaryCompareCol
a980: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
a990: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
a9a0: 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d           pEList-
a9b0: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
a9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
a9d0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
a9e0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
a9f0: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
aa00: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
aa10: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a  ).        **..**
aa20: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
aa30: 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
aa40: 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
aa50: 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
aa60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
aa70: 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
aa80: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
aa90: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
aaa0: 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
aab0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
aac0: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
aad0: 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
aae0: 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
aaf0: 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
ab00: 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
ab10: 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
ab20: 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
ab30: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
ab40: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
ab50: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
ab60: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74  List;.        st
ab70: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ab80: 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20 20  em *pItem;..    
ab90: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
aba0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
abb0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
abc0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
abd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
abe0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
abf0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
ac00: 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20  >pColl;..       
ac10: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
ac20: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
ac30: 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
ac40: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
ac50: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
ac60: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
ac70: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
ac80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
ac90: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
aca0: 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20  pExpr;..        
acb0: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
acc0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
acd0: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
ace0: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
acf0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
ad00: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
ad10: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
ad20: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
ad30: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
ad40: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
ad50: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
ad60: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
ad70: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
ad80: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
ad90: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
ada0: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
adb0: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
adc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
add0: 66 28 20 74 65 73 74 41 64 64 72 3e 30 20 26 26  f( testAddr>0 &&
ade0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
adf0: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
ae10: 4f 70 20 2a 61 4f 70 20 3d 20 73 71 6c 69 74 65  Op *aOp = sqlite
ae20: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 74 65  3VdbeGetOp(v, te
ae30: 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20  stAddr-1);.     
ae40: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
ae50: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
ae60: 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<3; i++){.  
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 61 4f 70 5b              aOp[
ae80: 69 5d 2e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  i].opcode = OP_N
ae90: 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oop;.           
aea0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
aeb0: 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  estAddr = 0;.   
aec0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
aed0: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
aee0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
aef0: 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
af00: 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
af10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
af20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
af30: 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20  arse, pE2);.    
af40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af50: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
af60: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
af70: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
af80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
afa0: 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
afb0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
afc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
afd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
afe0: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
aff0: 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f  (void *)&keyInfo
b000: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
b010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b020: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  }..    case TK_E
b030: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
b040: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
b050: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74     /* This has t
b060: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45  o be a scalar SE
b070: 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
b080: 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a  code to put the.
b090: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
b0a0: 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e  f this select in
b0b0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61   a memory cell a
b0c0: 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  nd record the nu
b0d0: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
b0e0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
b0f0: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20   in iColumn..   
b100: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
b110: 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f  ic const Token o
b120: 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31 22 2c  ne = { (u8*)"1",
b130: 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53   0, 1 };.      S
b140: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
b150: 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20     int iMem;.   
b160: 20 20 20 69 6e 74 20 73 6f 70 3b 0a 0a 20 20 20     int sop;..   
b170: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
b180: 6e 20 3d 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  n = iMem = pPars
b190: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
b1a0: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70   pSel = pExpr->p
b1b0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
b1c0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b1d0: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
b1e0: 20 20 73 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b    sop = SRT_Mem;
b1f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b200: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b210: 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30  MemNull, iMem, 0
b220: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b230: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e  omment((v, "# In
b240: 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
b250: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
b260: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20  se{.        sop 
b270: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
b280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b290: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
b2a0: 49 6e 74 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20  Int, 0, iMem);. 
b2b0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
b2c0: 6e 74 28 28 76 2c 20 22 23 20 49 6e 69 74 20 45  nt((v, "# Init E
b2d0: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
b2e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b2f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
b300: 28 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a  (pSel->pLimit);.
b310: 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
b320: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
b330: 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20  (TK_INTEGER, 0, 
b340: 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20  0, &one);.      
b350: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
b360: 61 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c  arse, pSel, sop,
b370: 20 69 4d 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20   iMem, 0, 0, 0, 
b380: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
b390: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
b3a0: 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20  ( testAddr ){.  
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
b3c0: 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64  pHere(v, testAdd
b3d0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
b3e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b3f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b400: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  RY */../*.** Gen
b410: 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
b420: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
b430: 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
b440: 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
b450: 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20  xt z[0..n-1] on 
b460: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74  the stack..*/.st
b470: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
b480: 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63  teger(Vdbe *v, c
b490: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
b4a0: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t n){.  int i;. 
b4b0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
b4c0: 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20  nt32(z, &i) ){. 
b4d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b4e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b4f0: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  r, i, 0);.  }els
b500: 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74  e if( sqlite3Fit
b510: 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a  sIn64Bits(z) ){.
b520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
b530: 70 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p3(v, OP_Int64, 
b540: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d  0, 0, z, n);.  }
b550: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b560: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52  3VdbeOp3(v, OP_R
b570: 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29  eal, 0, 0, z, n)
b580: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
b590: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
b5a0: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
b5b0: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
b5c0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
b5d0: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
b5e0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74   the result on t
b5f0: 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e  he top of stack.
b600: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
b610: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
b620: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
b630: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
b640: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
b650: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
b660: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
b670: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
b680: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
b690: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
b6a0: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
b6b0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
b6c0: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
b6d0: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
b6e0: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
b6f0: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
b700: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
b710: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
b720: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
b730: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
b740: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
b750: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
b760: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
b770: 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
b780: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
b790: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
b7a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
b7b0: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
b7c0: 6e 74 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31  nt stackChng = 1
b7d0: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
b7e0: 66 20 63 68 61 6e 67 65 20 74 6f 20 73 74 61 63  f change to stac
b7f0: 6b 20 64 65 70 74 68 20 2a 2f 0a 0a 20 20 69 66  k depth */..  if
b800: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b810: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
b820: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b830: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
b840: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  ll, 0, 0);.    r
b850: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20  eturn;.  }.  op 
b860: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
b870: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
b880: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
b890: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
b8a0: 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
b8b0: 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
b8c0: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
b8d0: 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
b8e0: 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
b8f0: 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
b900: 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
b910: 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
b920: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b930: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b940: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 43 6f 6c  OP_MemLoad, pCol
b950: 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
b960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b970: 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
b980: 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
b990: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
b9a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b9b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
b9c0: 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
b9d0: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
ba00: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 62  lumn);.        b
ba10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ba20: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
ba30: 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
ba40: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
ba50: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
ba60: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
ba70: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
ba80: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
baa0: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
bab0: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
bac0: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
bad0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
bae0: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3e 30  arse->ckOffset>0
baf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
bb00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bb10: 4f 50 5f 44 75 70 2c 20 70 50 61 72 73 65 2d 3e  OP_Dup, pParse->
bb20: 63 6b 4f 66 66 73 65 74 2d 70 45 78 70 72 2d 3e  ckOffset-pExpr->
bb30: 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31 29 3b 0a 20  iColumn-1, 1);. 
bb40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
bb50: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
bb60: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c   ){.        Tabl
bb70: 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
bb80: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
bb90: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
bba0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
bbb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bbc0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
bbd0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
bbe0: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  iCol);.        s
bbf0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
bc00: 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
bc10: 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
bc20: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
bc30: 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 20 69  _POINT.        i
bc40: 66 28 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  f( pTab && pTab-
bc50: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
bc60: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
bc70: 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  _REAL ){.       
bc80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bc90: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  dOp(v, OP_RealAf
bca0: 66 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20  finity, 0, 0);. 
bcb0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
bcc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bcd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bce0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
bcf0: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
bd00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
bd10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bd20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
bd30: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
bd40: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28 63 68  deInteger(v, (ch
bd50: 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
bd60: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
bd70: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
bd80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bd90: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
bda0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
bdb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bdc0: 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c  K_FLOAT==OP_Real
bdd0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bde0: 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f  ( TK_STRING==OP_
bdf0: 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20 20 20  String8 );.     
be00: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
be10: 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  xpr(pExpr);.    
be20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
be30: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 28 63  (v, op, 0, 0, (c
be40: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
be50: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
be60: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n.n);.      brea
be70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
be80: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
be90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bea0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
beb0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
bec0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
bed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
bee0: 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
bef0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
bf00: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
bf10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
bf20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bf30: 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c  K_BLOB==OP_HexBl
bf40: 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  ob );.      n = 
bf50: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d  pExpr->token.n -
bf60: 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63   3;.      z = (c
bf70: 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
bf80: 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20 20 61  n.z + 2;.      a
bf90: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
bfa0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
bfb0: 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22 22 3b  .        z = "";
bfc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
bfd0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
bfe0: 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29   op, 0, 0, z, n)
bff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c000: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c010: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
c020: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
c030: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c040: 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
c050: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
c060: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
c070: 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20  oken.n>1 ){.    
c080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
c090: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
c0a0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
c0b0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
c0c0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  en.n);.      }. 
c0d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c0e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
c0f0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
c100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c110: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
c120: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
c130: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c140: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c150: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
c160: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
c170: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
c180: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
c190: 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
c1a0: 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
c1b0: 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20 6f 70       int aff, op
c1c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c1d0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c1e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
c1f0: 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
c200: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 26  e3AffinityType(&
c210: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  pExpr->token);. 
c220: 20 20 20 20 20 6f 70 20 3d 20 61 66 66 20 2d 20       op = aff - 
c230: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
c240: 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20 20  + OP_ToText;.   
c250: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f     assert( op==O
c260: 50 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61  P_ToText    || a
c270: 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff!=SQLITE_AFF_T
c280: 45 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20  EXT    );.      
c290: 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 54  assert( op==OP_T
c2a0: 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21  oBlob    || aff!
c2b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
c2c0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
c2d0: 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f 4e 75  ert( op==OP_ToNu
c2e0: 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53 51  meric || aff!=SQ
c2f0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c300: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c310: 28 20 6f 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20  ( op==OP_ToInt  
c320: 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54     || aff!=SQLIT
c330: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
c340: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
c350: 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20  p==OP_ToReal    
c360: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
c370: 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20  FF_REAL    );.  
c380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c390: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
c3a0: 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68  );.      stackCh
c3b0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ng = 0;.      br
c3c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
c3d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
c3e0: 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
c3f0: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
c400: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
c410: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
c420: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
c430: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
c440: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
c450: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
c460: 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
c470: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
c480: 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
c490: 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
c4a0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
c4b0: 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
c4c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c4d0: 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
c4e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c4f0: 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
c500: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c510: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c520: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c530: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c540: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c550: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
c560: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
c570: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c580: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
c590: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
c5a0: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31    stackChng = -1
c5b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c5c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c5d0: 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
c5e0: 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
c5f0: 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
c600: 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
c610: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
c620: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
c630: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
c640: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
c650: 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
c660: 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
c670: 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
c680: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
c690: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
c6a0: 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
c6b0: 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
c6c0: 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
c6d0: 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
c6e0: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
c6f0: 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
c700: 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  dd );.      asse
c710: 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
c720: 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20  _Subtract );.   
c730: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
c740: 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
c750: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c760: 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
c770: 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  itAnd );.      a
c780: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
c790: 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20  =OP_BitOr );.   
c7a0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
c7b0: 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
c7c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c7d0: 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
c7e0: 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  iftLeft );.     
c7f0: 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
c800: 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
c810: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
c820: 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
c830: 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20  _Concat );.     
c840: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c850: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c860: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
c870: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c880: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
c890: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
c8a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c8b0: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
c8c0: 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b   stackChng = -1;
c8d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c8e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c8f0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
c900: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
c910: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
c920: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
c930: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
c940: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
c950: 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   || pLeft->op==T
c960: 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
c970: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20       Token *p = 
c980: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pLeft->token;. 
c990: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
c9a0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c9b0: 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70  "-%.*s", p->n, p
c9c0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ->z);.        if
c9d0: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
c9e0: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
c9f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ca00: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
ca10: 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a   0, z, p->n+1);.
ca20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ca30: 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74           codeInt
ca40: 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b  eger(v, z, p->n+
ca50: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
ca60: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
ca70: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  (z);.        bre
ca80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ca90: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
caa0: 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f  h into TK_NOT */
cab0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cac0: 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
cad0: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
cae0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
caf0: 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
cb00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
cb10: 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
cb20: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
cb30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cb40: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
cb50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cb60: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
cb70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
cb80: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
cb90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cba0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
cbb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
cbc0: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
cbd0: 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61  nt dest;.      a
cbe0: 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
cbf0: 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
cc00: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
cc10: 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
cc20: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ull );.      sql
cc30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cc40: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
cc50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
cc60: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cc70: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
cc80: 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71  .      dest = sq
cc90: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
cca0: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
ccb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ccc0: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
ccd0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
cce0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ccf0: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
cd00: 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e  ;.      stackChn
cd10: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  g = 0;.      bre
cd20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
cd30: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
cd40: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  ON: {.      AggI
cd50: 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78  nfo *pInfo = pEx
cd60: 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
cd70: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
cd80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
cd90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cda0: 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
cdb0: 67 67 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20  ggregate: %T",. 
cdc0: 20 20 20 20 20 20 20 20 20 20 20 26 70 45 78 70             &pExp
cdd0: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
cde0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
cdf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ce00: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
ce10: 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70  Info->aFunc[pExp
ce20: 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30  r->iAgg].iMem, 0
ce30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ce40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ce50: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
ce60: 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
ce70: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
ce80: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
ce90: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
cea0: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
ceb0: 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  xpr = pList ? pL
cec0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
ced0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
cee0: 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Def;.      int n
cef0: 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Id;.      const 
cf00: 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20  char *zId;.     
cf10: 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   int constMask =
cf20: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
cf30: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
cf40: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
cf50: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
cf60: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
cf70: 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45   zId = (char*)pE
cf80: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
cf90: 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
cfa0: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
cfb0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
cfc0: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
cfd0: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
cfe0: 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b   nExpr, enc, 0);
cff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d000: 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
d010: 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  nExpr = sqlite3E
d020: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
d030: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a  pParse, pList);.
d040: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d050: 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20  <nExpr && i<32; 
d060: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
d070: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
d080: 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61  onstant(pList->a
d090: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
d0a0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73          constMas
d0b0: 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20  k |= (1<<i);.   
d0c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d0d0: 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
d0e0: 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29  lSeq && !pColl )
d0f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
d100: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
d110: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d120: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d130: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d140: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
d150: 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  Def->needCollSeq
d160: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d170: 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
d180: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
d190: 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
d1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
d1b0: 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
d1c0: 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
d1d0: 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P3_COLLSEQ);
d1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
d1f0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d200: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f   OP_Function, co
d210: 6e 73 74 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20  nstMask, nExpr, 
d220: 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
d230: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
d240: 73 74 61 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45  stackChng = 1-nE
d250: 78 70 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  xpr;.      break
d260: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
d270: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
d280: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
d290: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
d2a0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
d2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
d2c0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
d2d0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
d2e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d2f0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
d300: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
d310: 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
d320: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61  mment((v, "# loa
d330: 64 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  d subquery resul
d340: 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  t"));.      brea
d350: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d360: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
d370: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
d380: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
d390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
d3a0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
d3b0: 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  e, pExpr);..    
d3c0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d3d0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
d3e0: 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
d3f0: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
d400: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
d410: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
d420: 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
d430: 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
d440: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
d450: 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20  .      ** P3 of 
d460: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
d470: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
d480: 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
d490: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
d4a0: 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  r);..      sqlit
d4b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d4c0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
d4d0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
d4e0: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
d4f0: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
d500: 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72  )". The temporar
d510: 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  y table.      **
d520: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63   pExpr->iTable c
d530: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
d540: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
d550: 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20  the (...) set.. 
d560: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
d570: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d580: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d590: 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ft);.      addr 
d5a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d5b0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
d5c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d5d0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
d5e0: 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20  l, -1, addr+4); 
d5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
d600: 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20  dr + 0 */.      
d610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d620: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
d630: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d640: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d650: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
d660: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d670: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
d680: 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20  0, addr+7);.    
d690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
d6a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
d6b0: 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  d, 1, 0, &affini
d6c0: 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64  ty, 1);   /* add
d6d0: 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73  r + 4 */.      s
d6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d6f0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
d700: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72  pr->iTable, addr
d710: 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +7);.      sqlit
d720: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d730: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
d740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d750: 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a     /* addr + 6 *
d760: 2f 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  /..      break;.
d770: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
d780: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
d790: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
d7a0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
d7b0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
d7c0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
d7d0: 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
d7e0: 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  ->pList->a;.    
d7f0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
d800: 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
d810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d820: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
d830: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
d840: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d850: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
d860: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d870: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
d880: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
d890: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
d8a0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
d8b0: 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Ge, 0, 0);.   
d8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d8d0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
d8e0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49  1, 0);.      pLI
d8f0: 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
d900: 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
d910: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
d920: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d930: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
d940: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
d950: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
d960: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30  ght, OP_Le, 0, 0
d970: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d980: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d990: 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  And, 0, 0);.    
d9a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d9b0: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
d9c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  :.    case TK_AS
d9d0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
d9e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d9f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
da00: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
da10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
da20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
da30: 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
da40: 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f     int expr_end_
da50: 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74  label;.      int
da60: 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20   jumpInst;.     
da70: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
da80: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
da90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
daa0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
dab0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
dac0: 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61  stelem;..      a
dad0: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
dae0: 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
daf0: 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t((pExpr->pList-
db00: 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
db10: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
db20: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
db30: 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
db40: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
db50: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
db60: 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
db70: 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
db80: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
db90: 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f  .      expr_end_
dba0: 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  label = sqlite3V
dbb0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
dbc0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
dbd0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
dbe0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
dbf0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
dc00: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
dc10: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
dc20: 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
dc30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
dc40: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
dc50: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
dc60: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
dc70: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
dc80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
dc90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
dca0: 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a   OP_Dup, 1, 1);.
dcb0: 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e            jumpIn
dcc0: 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  st = codeCompare
dcd0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
dce0: 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d  pLeft, aListelem
dcf0: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
dd20: 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 0, 1);.      
dd30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dd40: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
dd50: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
dd60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
dd70: 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74  jumpInst = sqlit
dd80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
dd90: 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a  P_IfNot, 1, 0);.
dda0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ddb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ddc0: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
ddd0: 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b  lem[i+1].pExpr);
dde0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ddf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
de00: 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e  Goto, 0, expr_en
de10: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
de20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
de30: 70 48 65 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73  pHere(v, jumpIns
de40: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
de50: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
de60: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
de70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
de80: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
de90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
dea0: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
deb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
dec0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ded0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
dee0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
def0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
df00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
df10: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
df20: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
df30: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
df40: 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c  el(v, expr_end_l
df50: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  abel);.      bre
df60: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
df70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
df80: 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
df90: 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
dfa0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72   if( !pParse->tr
dfb0: 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20  igStack ){.     
dfc0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
dfd0: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
e000: 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
e010: 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
e020: 67 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b  gram");..return;
e030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e040: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
e050: 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  n!=OE_Ignore ){.
e060: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
e070: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
e080: 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a  =OE_Rollback ||.
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
e0b0: 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20  == OE_Abort ||. 
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
e0e0: 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20  = OE_Fail );.   
e0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
e100: 75 6f 74 65 45 78 70 72 28 70 45 78 70 72 29 3b  uoteExpr(pExpr);
e110: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
e120: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48  3VdbeOp3(v, OP_H
e130: 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  alt, SQLITE_CONS
e140: 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69  TRAINT, pExpr->i
e150: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
e180: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
e190: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20  ken.n);.      } 
e1a0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
e1b0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
e1c0: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e  Column == OE_Ign
e1d0: 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ore );.         
e1e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e1f0: 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f  (v, OP_ContextPo
e200: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
e210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e220: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
e230: 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  0, pParse->trigS
e240: 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70  tack->ignoreJump
e250: 29 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65  );.         Vdbe
e260: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72  Comment((v, "# r
e270: 61 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b  aise(IGNORE)"));
e280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e290: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
e2a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e2b0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
e2c0: 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  f( pParse->ckOff
e2d0: 73 65 74 20 29 7b 0a 20 20 20 20 70 50 61 72 73  set ){.    pPars
e2e0: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 2b 3d 20 73  e->ckOffset += s
e2f0: 74 61 63 6b 43 68 6e 67 3b 0a 20 20 20 20 61 73  tackChng;.    as
e300: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
e310: 4f 66 66 73 65 74 20 29 3b 0a 20 20 7d 0a 7d 0a  Offset );.  }.}.
e320: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e330: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a  OMIT_TRIGGER./*.
e340: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e350: 20 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74   that evalutes t
e360: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
e370: 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74  ion and leaves t
e380: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20  he result.** on 
e390: 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20  the stack.  See 
e3a0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72  also sqlite3Expr
e3b0: 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Code()..**.** Th
e3c0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
e3d0: 20 61 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20   also cache the 
e3e0: 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66  result and modif
e3f0: 79 20 74 68 65 20 70 45 78 70 72 20 74 72 65 65  y the pExpr tree
e400: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77  .** so that it w
e410: 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20  ill make use of 
e420: 74 68 65 20 63 61 63 68 65 64 20 72 65 73 75 6c  the cached resul
e430: 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  t on subsequent 
e440: 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72  evaluations.** r
e450: 61 74 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75  ather than evalu
e460: 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ate the whole ex
e470: 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20  pression again. 
e480: 20 54 72 69 76 69 61 6c 20 65 78 70 72 65 73 73   Trivial express
e490: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20  ions are.** not 
e4a0: 63 61 63 68 65 64 2e 20 20 49 66 20 74 68 65 20  cached.  If the 
e4b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61  expression is ca
e4c0: 63 68 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74  ched, its result
e4d0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
e4e0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  .** memory locat
e4f0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
e500: 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
e510: 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
e520: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
e530: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
e540: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
e550: 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61  nt iMem;.  int a
e560: 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69  ddr1, addr2;.  i
e570: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
e580: 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
e590: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e5a0: 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  dr(v);.  sqlite3
e5b0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e5c0: 20 70 45 78 70 72 29 3b 0a 20 20 61 64 64 72 32   pExpr);.  addr2
e5d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
e5e0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
e5f0: 69 66 28 20 61 64 64 72 32 3e 61 64 64 72 31 2b  if( addr2>addr1+
e600: 31 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65  1 || sqlite3Vdbe
e610: 47 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29 2d  GetOp(v, addr1)-
e620: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63  >opcode==OP_Func
e630: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d  tion ){.    iMem
e640: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
e650: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
e660: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
e670: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
e680: 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29  mStore, iMem, 0)
e690: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  ;.    pExpr->op 
e6a0: 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
e6b0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
e6c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
e6d0: 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65   that pushes the
e6e0: 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
e6f0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
e700: 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
e710: 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65  on list onto the
e720: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   stack..**.** Re
e730: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
e740: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68  of elements push
e750: 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ed onto the stac
e760: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
e770: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
e780: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
e790: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
e7a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e7b0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
e7c0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
e7d0: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
e7e0: 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74  coded */.){.  st
e7f0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e800: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
e810: 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20 70 4c 69   i, n;.  if( pLi
e820: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
e830: 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  ;.  n = pList->n
e840: 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65  Expr;.  for(pIte
e850: 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b  m=pList->a, i=n;
e860: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
e870: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
e880: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e890: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
e8a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
e8b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
e8c0: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
e8d0: 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
e8e0: 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
e8f0: 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
e900: 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
e910: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
e920: 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
e930: 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
e940: 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
e950: 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
e960: 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
e970: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
e980: 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
e990: 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
e9a0: 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
e9b0: 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
e9c0: 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
e9d0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
e9e0: 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  is true..**.** T
e9f0: 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
ea00: 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
ea10: 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
ea20: 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
ea30: 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
ea40: 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
ea50: 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
ea60: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
ea70: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
ea80: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
ea90: 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
eaa0: 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
eab0: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
eac0: 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
ead0: 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
eae0: 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
eaf0: 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
eb00: 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
eb10: 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
eb20: 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
eb30: 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
eb40: 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
eb50: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
eb60: 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
eb70: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
eb80: 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
eb90: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
eba0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ebb0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
ebc0: 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66  = 0;.  int ckOff
ebd0: 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b  set = pParse->ck
ebe0: 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d  Offset;.  if( v=
ebf0: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
ec00: 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20   return;.  op = 
ec10: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
ec20: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
ec30: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
ec40: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
ec50: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ec60: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
ec70: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
ec80: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ec90: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
eca0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
ecb0: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
ecc0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
ecd0: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
ece0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
ecf0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ed00: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
ed10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ed20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
ed30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
ed40: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
ed50: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ed60: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
ed70: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
ed80: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
ed90: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
eda0: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
edb0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
edc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
edd0: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
ede0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
edf0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
ee00: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
ee10: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
ee20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ee30: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
ee40: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
ee50: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
ee60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
ee70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
ee80: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
ee90: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
eea0: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
eeb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
eec0: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
eed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
eee0: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
eef0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
ef00: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
ef10: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
ef20: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
ef30: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
ef40: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
ef50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ef60: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ef70: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
ef80: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ef90: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
efa0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
efb0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
efc0: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
efd0: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65  ->pRight, op, de
efe0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
eff0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f000: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f010: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
f020: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
f030: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
f040: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
f050: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
f060: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
f070: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
f080: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f090: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
f0a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
f0b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f0c0: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
f0d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f0e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f0f0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
f100: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
f110: 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ion "x BETWEEN y
f120: 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65   AND z" is imple
f130: 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
f140: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
f150: 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33  F (x < y) GOTO 3
f160: 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28  .      ** 2 IF (
f170: 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65  x <= z) GOTO <de
f180: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e  st>.      ** 3 .
f190: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
f1a0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
f1b0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
f1c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
f1d0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
f1e0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
f1f0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
f200: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f210: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
f220: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f230: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f240: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
f250: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f260: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
f270: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
f280: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
f290: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
f2a0: 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75  t, OP_Lt, 0, !ju
f2b0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
f2c0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
f2d0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
f2e0: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
f2f0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f300: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
f310: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
f320: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
f330: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74  ght, OP_Le, dest
f340: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a  , jumpIfNull);..
f350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f360: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
f370: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
f380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
f390: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
f3a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f3b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
f3c0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
f3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f3e0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
f3f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f400: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
f410: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f420: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
f430: 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  f, jumpIfNull, d
f440: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
f450: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  k;.    }.  }.  p
f460: 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20  Parse->ckOffset 
f470: 3d 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  = ckOffset;.}../
f480: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f490: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
f4a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
f4b0: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
f4c0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
f4d0: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
f4e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
f4f0: 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
f500: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
f510: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
f520: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
f530: 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
f540: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
f550: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
f560: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
f570: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
f580: 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
f590: 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65  mpIfNull is true
f5a0: 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
f5b0: 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
f5c0: 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64  s false..*/.void
f5d0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
f5e0: 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
f5f0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
f600: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
f610: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
f620: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
f630: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
f640: 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73   0;.  int ckOffs
f650: 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f  et = pParse->ckO
f660: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d  ffset;.  if( v==
f670: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
f680: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
f690: 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
f6a0: 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
f6b0: 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
f6c0: 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
f6d0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
f6e0: 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
f6f0: 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
f700: 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
f710: 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
f720: 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
f730: 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
f740: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
f750: 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
f760: 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
f770: 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
f780: 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
f790: 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
f7a0: 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
f7b0: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
f7d0: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
f7e0: 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
f7f0: 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
f800: 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
f810: 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
f820: 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
f830: 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
f840: 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
f850: 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
f860: 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
f870: 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
f880: 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
f890: 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
f8a0: 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
f8b0: 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
f8c0: 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
f8d0: 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
f8e0: 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
f8f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
f900: 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
f910: 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
f920: 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
f930: 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
f940: 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
f950: 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
f960: 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
f970: 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
f980: 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
f990: 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
f9a0: 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
f9b0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
f9c0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
f9d0: 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
f9e0: 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
f9f0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
fa00: 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
fa10: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
fa20: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fa30: 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
fa40: 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
fa50: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
fa60: 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
fa70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
fa80: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
fa90: 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
faa0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
fab0: 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
fac0: 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
fad0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
fae0: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
faf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
fb00: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
fb10: 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
fb20: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
fb30: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
fb40: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
fb50: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
fb60: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
fb70: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
fb80: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
fb90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
fba0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
fbb0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
fbc0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
fbd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fbe0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
fbf0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
fc00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
fc10: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
fc20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
fc30: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
fc40: 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
fc50: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
fc60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
fc70: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
fc80: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
fc90: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
fca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fcb0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
fcc0: 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
fcd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
fce0: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
fcf0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
fd00: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
fd10: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
fd20: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
fd30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fd40: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
fd50: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
fd60: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
fd70: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
fd80: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
fd90: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
fda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fdb0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
fdc0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
fdd0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fde0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
fdf0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
fe00: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
fe10: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
fe20: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
fe30: 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
fe40: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
fe50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fe60: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
fe70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
fe80: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
fe90: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
fea0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
feb0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
fec0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
fed0: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
fee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fef0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
ff00: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EEN: {.      /* 
ff10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
ff20: 73 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41  s "x BETWEEN y A
ff30: 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70  ND z". It is imp
ff40: 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20  lemented as:.   
ff50: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31     **.      ** 1
ff60: 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54   IF (x >= y) GOT
ff70: 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47  O 3.      ** 2 G
ff80: 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
ff90: 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29   ** 3 IF (x > z)
ffa0: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
ffb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
ffc0: 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72  addr;.      Expr
ffd0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
ffe0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
fff0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
10000 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
10010 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
10020 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10030 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
10040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10050 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
10060 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10070 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10080 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
10090 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
100a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
100b0 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  (v);.      codeC
100c0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
100d0 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
100e0 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75  _Ge, addr+3, !ju
100f0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
10100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10110 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
10120 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
10130 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10140 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
10150 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
10160 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
10170 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
10180 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
10190 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
101a0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
101b0 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
101c0 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74  t, pRight, OP_Gt
101d0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
101e0 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
101f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
10200 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
10210 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10220 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
10230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10240 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
10250 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
10260 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
10270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
10280 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20  rse->ckOffset = 
10290 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  ckOffset;.}../*.
102a0 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
102b0 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
102c0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
102d0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e    Return TRUE (n
102e0 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74  on-zero).** if t
102f0 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
10300 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c  l and return FAL
10310 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65  SE if they diffe
10320 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f  r in any way..*/
10330 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
10340 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
10350 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
10360 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
10370 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10380 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  pB==0;.  }else i
10390 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pB==0 ){.    
103a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
103b0 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
103c0 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
103d0 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20   if( (pA->flags 
103e0 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d  & EP_Distinct)!=
103f0 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  (pB->flags & EP_
10400 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75  Distinct) ) retu
10410 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
10420 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
10430 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70  pA->pLeft, pB->p
10440 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30  Left) ) return 0
10450 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
10460 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
10470 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
10480 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ht) ) return 0;.
10490 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20    if( pA->pList 
104a0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70  ){.    if( pB->p
104b0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
104c0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   0;.    if( pA->
104d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42  pList->nExpr!=pB
104e0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  ->pList->nExpr )
104f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66   return 0;.    f
10500 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c  or(i=0; i<pA->pL
10510 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
10520 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  {.      if( !sql
10530 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
10540 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pA->pList->a[i].
10550 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74  pExpr, pB->pList
10560 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
10570 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10580 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
10590 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d  .  }else if( pB-
105a0 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65  >pList ){.    re
105b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
105c0 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  ( pA->pSelect ||
105d0 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72   pB->pSelect ) r
105e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
105f0 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
10600 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f  Table || pA->iCo
10610 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d  lumn!=pB->iColum
10620 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
10630 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20  if( pA->token.z 
10640 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74  ){.    if( pB->t
10650 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75  oken.z==0 ) retu
10660 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42  rn 0;.    if( pB
10670 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74  ->token.n!=pA->t
10680 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20  oken.n ) return 
10690 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
106a0 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
106b0 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63  *)pA->token.z,(c
106c0 68 61 72 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a  har*)pB->token.z
106d0 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30  ,pB->token.n)!=0
106e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
106f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
10700 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a  return 1;.}.../*
10710 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
10720 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
10730 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
10740 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
10750 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
10760 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
10770 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
10780 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
10790 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
107a0 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
107b0 6f 43 6f 6c 75 6d 6e 28 41 67 67 49 6e 66 6f 20  oColumn(AggInfo 
107c0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
107d0 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41  ;.  i = sqlite3A
107e0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f  rrayAllocate((vo
107f0 69 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f  id**)&pInfo->aCo
10800 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
10810 3e 61 43 6f 6c 5b 30 5d 29 2c 20 33 29 3b 0a 20  >aCol[0]), 3);. 
10820 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
10830 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
10840 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
10850 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
10860 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
10870 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
10880 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
10890 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
108a0 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
108b0 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
108c0 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
108d0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
108e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
108f0 67 67 49 6e 66 6f 46 75 6e 63 28 41 67 67 49 6e  ggInfoFunc(AggIn
10900 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
10910 74 20 69 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  t i;.  i = sqlit
10920 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
10930 28 76 6f 69 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e  (void**)&pInfo->
10940 61 46 75 6e 63 2c 20 73 69 7a 65 6f 66 28 70 49  aFunc, sizeof(pI
10950 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 20  nfo->aFunc[0]), 
10960 32 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b  2);.  if( i<0 ){
10970 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
10980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
10990 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
109a0 73 20 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f  s is an xFunc fo
109b0 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  r walkExprTree()
109c0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
109d0 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  nt .** sqlite3Ex
109e0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
109f0 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
10a00 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
10a10 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
10a20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
10a30 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
10a40 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
10a50 7a 65 73 20 74 68 65 20 61 67 67 72 65 67 61 74  zes the aggregat
10a60 65 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45  e function at pE
10a70 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  xpr..*/.static i
10a80 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
10a90 61 74 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ate(void *pArg, 
10aa0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
10ab0 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
10ac0 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
10ad0 65 43 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b  eContext *)pArg;
10ae0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10af0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
10b00 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
10b10 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
10b20 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
10b30 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
10b40 70 41 67 67 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20  pAggInfo;.  ..  
10b50 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
10b60 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
10b70 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
10b80 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
10b90 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
10ba0 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
10bb0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
10bc0 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
10bd0 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
10be0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
10bf0 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20     if( pSrcList 
10c00 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
10c10 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
10c20 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
10c30 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
10c40 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
10c50 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
10c60 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
10c70 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
10c80 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
10c90 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
10ca0 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
10cb0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
10cc0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
10cd0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
10ce0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70   it means that p
10cf0 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61  Expr refers to a
10d00 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
10d10 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e     ** that is in
10d20 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
10d30 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
10d40 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20  e query.  .     
10d50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
10d60 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e        ** Make an
10d70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63   entry for the c
10d80 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66  olumn in pAggInf
10d90 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65  o->aCol[] if the
10da0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
10db0 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72  * is not an entr
10dc0 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  y there already.
10dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
10de0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
10df0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
10e00 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
10e10 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
10e20 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
10e30 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
10e40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
10e50 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
10e60 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
10e80 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
10e90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
10eb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
10ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10ed0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
10ee0 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
10ef0 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 28 69 20 3d  >nColumn && (i =
10f00 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
10f10 6e 28 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  n(pAggInfo))>=0 
10f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
10f30 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
10f40 6f 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  o->aCol[i];.    
10f50 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
10f60 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
10f70 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
10f80 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
10f90 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
10fa0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
10fb0 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
10fc0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
10fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
10fe0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
10ff0 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
11000 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
11010 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
11020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
11030 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
11040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11050 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
11070 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
11080 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
11090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
110a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
110b0 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
110c0 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
110d0 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
110e0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
110f0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
11100 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
11110 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
11120 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
11130 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
11160 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
11170 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
11180 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
111a0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
111b0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
111e0 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
11200 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
11210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11220 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11230 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11240 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
11250 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
11260 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
11270 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
11280 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
11290 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
112a0 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
112b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
112c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
112d0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
112e0 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
112f0 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
11300 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
11310 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
11320 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
11330 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
11340 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
11350 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
11360 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
11370 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
11380 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
11390 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
113a0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
113b0 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
113c0 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
113d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
113e0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
113f0 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
11400 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
11410 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
11420 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
11430 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
11440 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  g = i;.         
11450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11460 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
11470 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
11480 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
11490 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
114a0 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
114b0 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
114c0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
114d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
114e0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
114f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e  .      /* The pN
11500 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73  C->nDepth==0 tes
11510 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61  t causes aggrega
11520 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
11530 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20  subqueries.     
11540 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65   ** to be ignore
11550 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
11560 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
11570 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
11580 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
11590 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
115a0 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
115b0 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
115c0 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
115d0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
115e0 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
115f0 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
11600 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
11610 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
11620 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
11630 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
11640 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
11650 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
11660 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
11670 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
11680 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
11690 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29  >pExpr, pExpr) )
116a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
116b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
116c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
116d0 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
116e0 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
116f0 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
11700 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
11710 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
11720 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
11730 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
11740 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
11750 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
11760 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  enc;.          i
11770 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
11780 63 28 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  c(pAggInfo);.   
11790 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
117a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
117b0 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
117c0 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
117d0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
117e0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
117f0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
11800 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
11810 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
11820 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
11830 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
11840 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
11850 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
11860 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45 78        (char*)pEx
11870 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
11880 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
118b0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
118c0 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
118d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
118e0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
118f0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
11910 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
11920 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11930 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
11940 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
11950 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
11960 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  t = -1;.        
11970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11980 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
11990 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70      /* Make pExp
119a0 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61  r point to the a
119b0 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49  ppropriate pAggI
119c0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74  nfo->aFunc[] ent
119d0 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ry.        */.  
119e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
119f0 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  g = i;.        p
11a00 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
11a10 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
11a20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
11a30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
11a40 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79    /* Recursively
11a50 20 77 61 6c 6b 20 73 75 62 71 75 65 72 69 65 73   walk subqueries
11a60 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f   looking for TK_
11a70 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61  COLUMN nodes tha
11a80 74 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62  t need.  ** to b
11a90 65 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f  e changed to TK_
11aa0 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74  AGG_COLUMN.  But
11ab0 20 69 6e 63 72 65 6d 65 6e 74 20 6e 44 65 70 74   increment nDept
11ac0 68 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54  h so that.  ** T
11ad0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
11ae0 6f 64 65 73 20 69 6e 20 73 75 62 71 75 65 72 69  odes in subqueri
11af0 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 63 68 61  es will be uncha
11b00 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
11b10 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
11b20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70  ){.    pNC->nDep
11b30 74 68 2b 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65  th++;.    walkSe
11b40 6c 65 63 74 45 78 70 72 28 70 45 78 70 72 2d 3e  lectExpr(pExpr->
11b50 70 53 65 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65  pSelect, analyze
11b60 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b  Aggregate, pNC);
11b70 0a 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68  .    pNC->nDepth
11b80 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  --;.  }.  return
11b90 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   0;.}../*.** Ana
11ba0 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65  lyze the given e
11bb0 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
11bc0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
11bd0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
11be0 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
11bf0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
11c00 64 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72  dded to the pPar
11c10 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
11c20 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69  ..** Make additi
11c30 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20  onal entries to 
11c40 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
11c50 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65  [] array as nece
11c60 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ssary..**.** Thi
11c70 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
11c80 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
11c90 61 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73  after the expres
11ca0 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a  sion has been.**
11cb0 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c   analyzed by sql
11cc0 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
11cd0 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ames()..**.** If
11ce0 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
11cf0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
11d00 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72   message in zErr
11d10 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  Msg and return.*
11d20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
11d30 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
11d40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
11d50 65 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65  eAggregates(Name
11d60 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
11d70 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
11d80 74 20 6e 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50  t nErr = pNC->pP
11d90 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61  arse->nErr;.  wa
11da0 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
11db0 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
11dc0 74 65 2c 20 70 4e 43 29 3b 0a 20 20 72 65 74 75  te, pNC);.  retu
11dd0 72 6e 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  rn pNC->pParse->
11de0 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a  nErr - nErr;.}..
11df0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
11e00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
11e10 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
11e20 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
11e30 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
11e40 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
11e50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
11e60 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
11e70 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
11e80 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
11e90 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
11ea0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11eb0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e  AnalyzeAggList(N
11ec0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
11ed0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
11ee0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
11ef0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
11f00 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
11f10 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28   nErr = 0;.  if(
11f20 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
11f30 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
11f40 2c 20 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  , i=0; nErr==0 &
11f50 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
11f60 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
11f70 0a 20 20 20 20 20 20 6e 45 72 72 20 2b 3d 20 73  .      nErr += s
11f80 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
11f90 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
11fa0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
11fb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11fc0 72 6e 20 6e 45 72 72 3b 0a 7d 0a                 rn nErr;.}.