/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 896f642936e9248b50c1449fd4b3924bcb149632:


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 36 30 20 32 30 30 36 2f 30 36 2f 31 33 20  .260 2006/06/13 
0220: 30 31 3a 30 34 3a 35 32 20 64 72 68 20 45 78 70  01:04:52 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 4d 61 6c 6c 6f 63  ( !sqlite3Malloc
2020: 46 61 69 6c 65 64 28 29 20 26 26 20 70 52 69 67  Failed() && pRig
2030: 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e  ht->z && pLeft->
2040: 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
2050: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c   pLeft->dyn==0 |
2060: 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74  | pLeft->z[pLeft
2070: 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->n]==0 );.    i
2080: 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30  f( pLeft->dyn==0
2090: 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d   && pRight->dyn=
20a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
20b0: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66  r->span.z = pLef
20c0: 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70  t->z;.      pExp
20d0: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67  r->span.n = pRig
20e0: 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d  ht->n + (pRight-
20f0: 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a  >z - pLeft->z);.
2100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2110: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d   pExpr->span.z =
2120: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
2130: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
2140: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2150: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
2160: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
2170: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
2180: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
2190: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45  e3ExprFunction(E
21a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
21b0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
21c0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
21d0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
21e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
21f0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
2200: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
2210: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
2220: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2230: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
2240: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
2250: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2260: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2270: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2280: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2290: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
22a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
22b0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
22c0: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
22d0: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
22e0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
22f0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72  pNew->token;.  r
2300: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
2310: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61  *.** Assign a va
2320: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f  riable number to
2330: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2340: 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69  hat encodes a wi
2350: 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65  ldcard.** in the
2360: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
2370: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
2380: 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69   Wildcards consi
2390: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
23a0: 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e  e "?" are assign
23b0: 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  ed the next sequ
23c0: 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62  ential.** variab
23d0: 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  le number..**.**
23e0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
23f0: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72  e form "?nnn" ar
2400: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
2410: 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65  umber "nnn".  We
2420: 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e   make.** sure "n
2430: 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62  nn" is not too b
2440: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  e to avoid a den
2450: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
2460: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
2470: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2480: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
2490: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
24a0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
24b0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
24c0: 22 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  " or "$aaa" are 
24d0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
24e0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
24f0: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
2500: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
2510: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
2520: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2530: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
2540: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
2550: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2560: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
2570: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
2580: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2590: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
25a0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
25b0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
25c0: 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  r){.  Token *pTo
25d0: 6b 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ken;.  if( pExpr
25e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
25f0: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
2600: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
2610: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
2620: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
2630: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
2640: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
2650: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
2660: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
2670: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
2680: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
2690: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
26a0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
26b0: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
26c0: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
26d0: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
26e0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
26f0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
2700: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
2710: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
2720: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
2730: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
2740: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
2750: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
2760: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
2770: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2780: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63  le = i = atoi((c
2790: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
27a0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  1]);.    if( i<1
27b0: 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58   || i>SQLITE_MAX
27c0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
27d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27f0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
2800: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
2810: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
2820: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2830: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
2840: 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  MBER);.    }.   
2850: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
2860: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
2870: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
2880: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2890: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
28a0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
28b0: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
28c0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
28d0: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
28e0: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
28f0: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
2900: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
2910: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
2920: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
2930: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
2940: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
2950: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
2960: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
2970: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
2980: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
2990: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
29a0: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
29b0: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
29c0: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
29d0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
29e0: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
29f0: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
2a00: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
2a10: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
2a20: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
2a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2a40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
2a50: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
2a60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2a80: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
2a90: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
2aa0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
2ab0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
2ac0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
2ad0: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
2ae0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
2af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
2b00: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
2b10: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
2b20: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
2b30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52  .        sqliteR
2b40: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f  eallocOrFree((vo
2b50: 69 64 2a 2a 29 26 70 50 61 72 73 65 2d 3e 61 70  id**)&pParse->ap
2b60: 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20  VarExpr,.       
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2b90: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61  Alloc*sizeof(pPa
2ba0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30  rse->apVarExpr[0
2bb0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ]) );.      }.  
2bc0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
2bd0: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
2be0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2bf0: 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  ( pParse->apVarE
2c00: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
2c10: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
2c20: 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72  xpr[pParse->nVar
2c30: 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b  Expr++] = pExpr;
2c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c50: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   } .}../*.** Rec
2c60: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
2c70: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
2c80: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
2c90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78  te3ExprDelete(Ex
2ca0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
2cb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
2cc0: 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29  f( p->span.dyn )
2cd0: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
2ce0: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  r*)p->span.z);. 
2cf0: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
2d00: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
2d10: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
2d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2d30: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29  Delete(p->pLeft)
2d40: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
2d50: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
2d60: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
2d70: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  istDelete(p->pLi
2d80: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
2d90: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
2da0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2db0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
2dc0: 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  * The Expr.token
2dd0: 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20   field might be 
2de0: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
2df0: 20 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e   that is quoted.
2e00: 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76  .** If so, remov
2e10: 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20  e the quotation 
2e20: 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  marks..*/.void s
2e30: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70  qlite3DequoteExp
2e40: 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  r(Expr *p){.  if
2e50: 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
2e60: 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f  erty(p, EP_Dequo
2e70: 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ted) ){.    retu
2e80: 72 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65  rn;.  }.  ExprSe
2e90: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2ea0: 44 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28  Dequoted);.  if(
2eb0: 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30   p->token.dyn==0
2ec0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2ed0: 6f 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74 6f 6b  okenCopy(&p->tok
2ee0: 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a  en, &p->token);.
2ef0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
2f00: 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  uote((char*)p->t
2f10: 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  oken.z);.}.../*.
2f20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2f30: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
2f40: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
2f50: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
2f60: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
2f70: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
2f80: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
2f90: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
2fa0: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
2fb0: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
2fc0: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
2fd0: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
2fe0: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
2ff0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
3000: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
3010: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3030: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
3040: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
3050: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3060: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
3070: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
3080: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
3090: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
30a0: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
30b0: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
30c0: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
30d0: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
30e0: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
30f0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
3100: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
3110: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
3120: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
3130: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3140: 45 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29  ExprDup(Expr *p)
3150: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
3160: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3170: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3180: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3190: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
31a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
31b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70  eturn 0;.  memcp
31c0: 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f  y(pNew, p, sizeo
31d0: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
31e0: 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29   p->token.z!=0 )
31f0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
3200: 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  n.z = (u8*)sqlit
3210: 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29  eStrNDup((char*)
3220: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74  p->token.z, p->t
3230: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65  oken.n);.    pNe
3240: 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31  w->token.dyn = 1
3250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3260: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b  ssert( pNew->tok
3270: 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  en.z==0 );.  }. 
3280: 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20   pNew->span.z = 
3290: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  0;.  pNew->pLeft
32a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
32b0: 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  p(p->pLeft);.  p
32c0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
32d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
32e0: 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d  pRight);.  pNew-
32f0: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
3300: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
3310: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
3320: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
3330: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65  SelectDup(p->pSe
3340: 6c 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lect);.  pNew->p
3350: 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20  Tab = p->pTab;. 
3360: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3370: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65  void sqlite3Toke
3380: 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f  nCopy(Token *pTo
3390: 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b  , Token *pFrom){
33a0: 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20  .  if( pTo->dyn 
33b0: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
33c0: 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69  ar*)pTo->z);.  i
33d0: 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20  f( pFrom->z ){. 
33e0: 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f     pTo->n = pFro
33f0: 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a  m->n;.    pTo->z
3400: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 53 74   = (u8*)sqliteSt
3410: 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70 46 72  rNDup((char*)pFr
3420: 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29  om->z, pFrom->n)
3430: 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d  ;.    pTo->dyn =
3440: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3450: 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d   pTo->z = 0;.  }
3460: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
3470: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
3480: 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20  ExprList *p){.  
3490: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
34a0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
34b0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
34c0: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
34d0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
34e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
34f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3500: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
3510: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3520: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3530: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77  ew->nExpr = pNew
3540: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45  ->nAlloc = p->nE
3550: 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  xpr;.  pNew->a =
3560: 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d   pItem = sqliteM
3570: 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a  alloc( p->nExpr*
3580: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
3590: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
35a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  0 ){.    sqliteF
35b0: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72  ree(pNew);.    r
35c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
35d0: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
35e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
35f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
3600: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
3610: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
3620: 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72  wExpr, *pOldExpr
3630: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
3640: 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20  pr = pNewExpr = 
3650: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3660: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
3670: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
3680: 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70  if( pOldExpr->sp
3690: 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45  an.z!=0 && pNewE
36a0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  xpr ){.      /* 
36b0: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
36c0: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
36d0: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
36e0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
36f0: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
3700: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c  ion list.  The l
3710: 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70  ogic in SELECT p
3720: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64  rocessing that d
3730: 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20  etermines.      
3740: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
3750: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
3760: 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20  esult set needs 
3770: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
3780: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3790: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77  3TokenCopy(&pNew
37a0: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c  Expr->span, &pOl
37b0: 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  dExpr->span);.  
37c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
37d0: 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70  pNewExpr==0 || p
37e0: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21  NewExpr->span.z!
37f0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
3800: 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  || pOldExpr->spa
3810: 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  n.z==0.         
3820: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c     || sqlite3Mal
3830: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20  locFailed() );. 
3840: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
3850: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3860: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
3870: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
3880: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
3890: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
38a0: 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20   pItem->isAgg = 
38b0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b  pOldItem->isAgg;
38c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
38d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
38e0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
38f0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
3900: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
3910: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
3920: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
3930: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
3940: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
3950: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
3960: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
3970: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
3980: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
3990: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
39a0: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
39b0: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
39c0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
39d0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
39e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
39f0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
3a00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3a10: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
3a20: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3a30: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
3a40: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
3a50: 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73  rcListDup(SrcLis
3a60: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
3a70: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
3a80: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
3a90: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
3aa0: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
3ab0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
3ac0: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
3ad0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
3ae0: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
3af0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
3b00: 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a  ocRaw( nByte );.
3b10: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
3b20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3b30: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
3b40: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
3b50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
3b60: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
3b70: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3b80: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
3b90: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
3ba0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3bb0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
3bc0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
3bd0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
3be0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
3bf0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72  base = sqliteStr
3c00: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  Dup(pOldItem->zD
3c10: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
3c20: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
3c30: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
3c40: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
3c50: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
3c60: 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ias = sqliteStrD
3c70: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  up(pOldItem->zAl
3c80: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
3c90: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
3ca0: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
3cb0: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
3cc0: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
3cd0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
3ce0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f    pNewItem->isPo
3cf0: 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  pulated = pOldIt
3d00: 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b  em->isPopulated;
3d10: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
3d20: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
3d30: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
3d40: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
3d50: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
3d60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
3d70: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
3d80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
3d90: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
3da0: 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  t);.    pNewItem
3db0: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
3dc0: 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  xprDup(pOldItem-
3dd0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49  >pOn);.    pNewI
3de0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
3df0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70  lite3IdListDup(p
3e00: 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  OldItem->pUsing)
3e10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3e20: 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74  colUsed = pOldIt
3e30: 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d  em->colUsed;.  }
3e40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3e50: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
3e60: 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73  3IdListDup(IdLis
3e70: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
3e80: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
3e90: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3ea0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3eb0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3ec0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
3ed0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3ee0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3ef0: 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e  ew->nId = pNew->
3f00: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b  nAlloc = p->nId;
3f10: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
3f20: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d  iteMallocRaw( p-
3f30: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
3f40: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
3f50: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
3f60: 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29  sqliteFree(pNew)
3f70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
3f80: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
3f90: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
3fa0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3fb0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
3fc0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
3fd0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3fe0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
3ff0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
4000: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
4010: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
4020: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
4030: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
4040: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
4050: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
4060: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
4070: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4080: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
4090: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
40a0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
40b0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
40c0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
40d0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
40e0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
40f0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
4100: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
4110: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
4120: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
4130: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
4140: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
4150: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
4160: 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70  3SrcListDup(p->p
4170: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
4180: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
4190: 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29  prDup(p->pWhere)
41a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
41b0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
41c0: 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75  ListDup(p->pGrou
41d0: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
41e0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
41f0: 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e  xprDup(p->pHavin
4200: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
4210: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
4220: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72  prListDup(p->pOr
4230: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
4240: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
4250: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
4260: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
4270: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77  >pPrior);.  pNew
4280: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
4290: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69  e3ExprDup(p->pLi
42a0: 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  mit);.  pNew->pO
42b0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
42c0: 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65  xprDup(p->pOffse
42d0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
42e0: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
42f0: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
4300: 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65   pNew->isResolve
4310: 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  d = p->isResolve
4320: 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  d;.  pNew->isAgg
4330: 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70   = p->isAgg;.  p
4340: 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  New->usesEphm = 
4350: 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c  0;.  pNew->disal
4360: 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  lowOrderBy = 0;.
4370: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
4380: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
4390: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
43a0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
43b0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
43c0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
43d0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
43e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
43f0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
4400: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4410: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
4420: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
4430: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4440: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
4450: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
4460: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
4470: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4480: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
4490: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
44a0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
44b0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
44c0: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
44d0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
44e0: 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20  Append(ExprList 
44f0: 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45  *pList, Expr *pE
4500: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  xpr, Token *pNam
4510: 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  e){.  if( pList=
4520: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
4530: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4540: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
4550: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
4560: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
4570: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
4580: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
4590: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b  st->nAlloc==0 );
45a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
45b0: 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d  ->nAlloc<=pList-
45c0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74  >nExpr ){.    st
45d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
45e0: 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e  em *a;.    int n
45f0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
4600: 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20  *2 + 4;.    a = 
4610: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
4620: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
4630: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
4640: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
4650: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
4660: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
4670: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70  st->a = a;.    p
4680: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e  List->nAlloc = n
4690: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
46a0: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
46b0: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
46c0: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
46d0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
46e0: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
46f0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
4700: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
4710: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
4720: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
4730: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
4740: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4750: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  n(pName);.    pI
4760: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
4770: 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pr;.  }.  return
4780: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
4790: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
47a0: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
47b0: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
47c0: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
47d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
47e0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
47f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
4800: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
4810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
4820: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
4830: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
4840: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
4850: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
4860: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
4870: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
4880: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
4890: 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
48a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
48b0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
48c0: 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45  =0 || (pList->nE
48d0: 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d  xpr==0 && pList-
48e0: 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20  >nAlloc==0) );. 
48f0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
4900: 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41  nExpr<=pList->nA
4910: 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49  lloc );.  for(pI
4920: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
4930: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
4940: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
4950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4960: 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
4970: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
4980: 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  eFree(pItem->zNa
4990: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
49a0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
49b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
49c0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ist);.}../*.** W
49d0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
49e0: 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46  n tree.  Call xF
49f0: 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64  unc for each nod
4a00: 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  e visited..**.**
4a10: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
4a20: 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74  e from xFunc det
4a30: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
4a40: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
4a50: 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65  ntinues..** 0 me
4a60: 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c  ans continue wal
4a70: 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20  king the tree.  
4a80: 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77  1 means do not w
4a90: 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20  alk children.** 
4aa0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  of the current n
4ab0: 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  ode but continue
4ac0: 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20   with siblings. 
4ad0: 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e   2 means abandon
4ae0: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c  .** the tree wal
4af0: 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a  k completely..**
4b00: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
4b10: 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72  alue from this r
4b20: 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61  outine is 1 to a
4b30: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
4b40: 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f  walk.** and 0 to
4b50: 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
4b60: 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72   NOTICE:  This r
4b70: 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74  outine does *not
4b80: 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73  * descend into s
4b90: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  ubqueries..*/.st
4ba0: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
4bb0: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
4bc0: 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a  , int (*)(void *
4bd0: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
4be0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  );.static int wa
4bf0: 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20  lkExprTree(Expr 
4c00: 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46  *pExpr, int (*xF
4c10: 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a  unc)(void*,Expr*
4c20: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
4c30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
4c40: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4c50: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46  n 0;.  rc = (*xF
4c60: 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72  unc)(pArg, pExpr
4c70: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
4c80: 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  {.    if( walkEx
4c90: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c  prTree(pExpr->pL
4ca0: 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  eft, xFunc, pArg
4cb0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
4cc0: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
4cd0: 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ee(pExpr->pRight
4ce0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
4cf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
4d00: 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  f( walkExprList(
4d10: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46  pExpr->pList, xF
4d20: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4d30: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
4d40: 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  urn rc>1;.}../*.
4d50: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
4d60: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
4d70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c   expression in l
4d80: 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist p..*/.static
4d90: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
4da0: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
4db0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
4dc0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
4dd0: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69   *pArg){.  int i
4de0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
4df0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
4e00: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
4e10: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  rn 0;.  for(i=p-
4e20: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
4e30: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
4e40: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
4e50: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74  walkExprTree(pIt
4e60: 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63  em->pExpr, xFunc
4e70: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
4e80: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4e90: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c   0;.}../*.** Cal
4ea0: 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  l walkExprTree()
4eb0: 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
4ec0: 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20  ssion in Select 
4ed0: 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  p, not including
4ee0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
4ef0: 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66  that are part of
4f00: 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20   sub-selects in 
4f10: 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  any FROM clause 
4f20: 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20  or the LIMIT.** 
4f30: 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73  or OFFSET expres
4f40: 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69  sions...*/.stati
4f50: 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74  c int walkSelect
4f60: 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20  Expr(Select *p, 
4f70: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
4f80: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
4f90: 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b  d *pArg){.  walk
4fa0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
4fb0: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
4fc0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
4fd0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e  (p->pWhere, xFun
4fe0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
4ff0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
5000: 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  upBy, xFunc, pAr
5010: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
5020: 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78  ee(p->pHaving, x
5030: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
5040: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
5050: 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20  OrderBy, xFunc, 
5060: 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  pArg);.  return 
5070: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0;.}.../*.** Thi
5080: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
5090: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
50a0: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
50b0: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67  ee()..**.** pArg
50c0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
50d0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
50e0: 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74  er.  If we can t
50f0: 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a  ell by looking.*
5100: 2a 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20  * at pExpr that 
5110: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
5120: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78  hat contains pEx
5130: 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  pr is not a cons
5140: 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69  tant.** expressi
5150: 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41  on, then set *pA
5160: 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  rg to 0 and retu
5170: 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20  rn 2 to abandon 
5180: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
5190: 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20  * If pExpr does 
51a0: 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c  does not disqual
51b0: 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
51c0: 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20  on from being a 
51d0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e  constant.** then
51e0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   do nothing..**.
51f0: 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67  ** After walking
5200: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c   the whole tree,
5210: 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65   if no nodes are
5220: 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71   found that disq
5230: 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78  ualify.** the ex
5240: 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73  pression as cons
5250: 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73  tant, then we as
5260: 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65  sume the whole e
5270: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
5280: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73  constant.  See s
5290: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
52a0: 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74  tant() for addit
52b0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
52c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
52d0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
52e0: 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ant(void *pArg, 
52f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
5300: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
5310: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  p ){.    /* Cons
5320: 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ider functions t
5330: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66  o be constant if
5340: 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d   all their argum
5350: 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  ents are constan
5360: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41  t.    ** and *pA
5370: 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73  rg==2 */.    cas
5380: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
5390: 20 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74 2a       if( *((int*
53a0: 29 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74 75  )pArg)==2 ) retu
53b0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
53c0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
53d0: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
53e0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
53f0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
5400: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
5410: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
5420: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
5430: 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51  LUMN:.#ifndef SQ
5440: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5450: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
5460: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
5470: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
5480: 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29  f.      *((int*)
5490: 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20  pArg) = 0;.     
54a0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63   return 2;.    c
54b0: 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20  ase TK_IN:.     
54c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
54d0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ect ){.        *
54e0: 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30  ((int*)pArg) = 0
54f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
5500: 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   2;.      }.    
5510: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
5520: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
5530: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
5540: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5550: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
5560: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
5570: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
5580: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
5590: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
55a0: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
55b0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
55c0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
55d0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
55e0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
55f0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
5600: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
5610: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
5620: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
5630: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
5640: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
5650: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
5660: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
5670: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5680: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
5690: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
56a0: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
56b0: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
56c0: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
56d0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
56e0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
56f0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
5700: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
5710: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
5720: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
5730: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
5740: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
5750: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
5760: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
5770: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
5780: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
5790: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
57a0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
57b0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
57c0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
57d0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
57e0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
57f0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
5800: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
5810: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5820: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
5830: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
5840: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
5850: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
5860: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
5870: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
5880: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
5890: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
58a0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
58b0: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
58c0: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
58d0: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
58e0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
58f0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
5900: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
5910: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
5920: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
5930: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
5940: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5950: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
5960: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
5970: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
5980: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
5990: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
59a0: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
59b0: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
59c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
59d0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
59e0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
59f0: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
5a00: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
5a10: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
5a20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5a30: 33 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a  3GetInt32((char*
5a40: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61  )p->token.z, pVa
5a50: 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lue) ){.        
5a60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5a70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5a80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5a90: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
5aa0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
5ab0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
5ac0: 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
5ad0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5ae0: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
5af0: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
5b00: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
5b10: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
5b20: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
5b30: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
5b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
5b70: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
5b80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
5b90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
5ba0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
5bb0: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
5bc0: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
5bd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
5be0: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
5bf0: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
5c00: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
5c10: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
5c20: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
5c30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
5c40: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
5c50: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
5c60: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
5c70: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
5c80: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
5c90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
5ca0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
5cb0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f  column of the fo
5cc0: 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  rm X.Y.Z or Y.Z 
5cd0: 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20  or just Z, look 
5ce0: 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20  up.** that name 
5cf0: 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f  in the set of so
5d00: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70  urce tables in p
5d10: 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65  SrcList and make
5d20: 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65   the pExpr .** e
5d30: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
5d40: 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61  efer back to tha
5d50: 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e  t source column.
5d60: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
5d70: 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d  changes.** are m
5d80: 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a  ade to pExpr:.**
5d90: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44  .**    pExpr->iD
5da0: 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20  b           Set 
5db0: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d  the index in db-
5dc0: 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61  >aDb[] of the da
5dd0: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a  tabase holding.*
5de0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5df0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61            the ta
5e00: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
5e10: 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20  ->iTable        
5e20: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f  Set to the curso
5e30: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
5e40: 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a   table obtained.
5e50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
5e60: 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
5e70: 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20  pSrcList..**    
5e80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20  pExpr->iColumn  
5e90: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
5ea0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
5eb0: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  thin the table..
5ec0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  **    pExpr->op 
5ed0: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
5ee0: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20  o TK_COLUMN..** 
5ef0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
5f00: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
5f10: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
5f20: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
5f30: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .**    pExpr->pR
5f40: 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20  ight        Any 
5f50: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
5f60: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
5f70: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
5f80: 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20  pDbToken is the 
5f90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
5fa0: 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20  base (the "X"). 
5fb0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
5fc0: 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69  be.** NULL meani
5fd0: 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20  ng that name is 
5fe0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20  of the form Y.Z 
5ff0: 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c  or Z.  Any avail
6000: 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  able database.**
6010: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54   can be used.  T
6020: 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69  he pTableToken i
6030: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
6040: 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22  e table (the "Y"
6050: 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75  ).  This.** valu
6060: 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66  e can be NULL if
6070: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73   pDbToken is als
6080: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62  o NULL.  If pTab
6090: 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20  leToken is NULL 
60a0: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  it.** means that
60b0: 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65   the form of the
60c0: 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74   name is Z and t
60d0: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  hat columns from
60e0: 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61   any table.** ca
60f0: 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  n be used..**.**
6100: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e   If the name can
6110: 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20  not be resolved 
6120: 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c  unambiguously, l
6130: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
6140: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
6150: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
6160: 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  n-zero.  Return 
6170: 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e  zero on success.
6180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
6190: 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72  ookupName(.  Par
61a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
61b0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
61c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
61d0: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
61e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
61f0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
6200: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
6210: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
6220: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
6230: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
6240: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
6250: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
6260: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
6270: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
6280: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
6290: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
62a0: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
62b0: 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74  e context used t
62c0: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61  o resolve the na
62d0: 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  me */.  Expr *pE
62e0: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
62f0: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
6300: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
6310: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
6320: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
6330: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
6340: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
6350: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
6360: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
6370: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
6380: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6390: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
63a0: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
63b0: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
63c0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
63d0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
63e0: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
63f0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
6400: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
6410: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
6420: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
6430: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
6440: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
6450: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  mes */.  int cnt
6460: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
6470: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
6480: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
6490: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
64a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
64b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
64c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
64d0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
64e0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f         /* Use fo
64f0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
6500: 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f  SrcList items */
6510: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
6520: 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d  t_item *pMatch =
6530: 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63   0;  /* The matc
6540: 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74  hing pSrcList it
6550: 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  em */.  NameCont
6560: 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e  ext *pTopNC = pN
6570: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  C;        /* Fir
6580: 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69  st namecontext i
6590: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20  n the list */.. 
65a0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
65b0: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
65c0: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
65d0: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
65e0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
65f0: 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e    zDb = sqlite3N
6600: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62  ameFromToken(pDb
6610: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d  Token);.  zTab =
6620: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
6630: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65  Token(pTableToke
6640: 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c  n);.  zCol = sql
6650: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
6660: 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b  n(pColumnToken);
6670: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
6680: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
6690: 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e      goto lookupn
66a0: 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ame_end;.  }..  
66b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
66c0: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43  -1;.  while( pNC
66d0: 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   && cnt==0 ){.  
66e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
66f0: 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  st;.    SrcList 
6700: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
6710: 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20  >pSrcList;..    
6720: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
6730: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
6740: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
6750: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
6760: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
6770: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
6780: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20   *pTab;.        
6790: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
67a0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
67b0: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d   .        pTab =
67c0: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
67d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
67e0: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ab!=0 );.       
67f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
6800: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
6810: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
6820: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6830: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
6840: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
6850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6860: 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
6870: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
6880: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
6890: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pItem->zAlias;. 
68a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
68b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
68c0: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
68d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
68e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
68f0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
6900: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
6910: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
6920: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
6930: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
6940: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
6950: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
6960: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
6970: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
6980: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
6990: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
69a0: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
69b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
69c0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
69d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
69e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69f0: 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b   if( 0==(cntTab+
6a00: 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
6a10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
6a20: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
6a30: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6a40: 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d  >pSchema = pTab-
6a50: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
6a60: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
6a70: 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  em;.        }.  
6a80: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
6a90: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
6aa0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
6ab0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
6ac0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6ad0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
6ae0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
6af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
6b00: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
6b10: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
6b20: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  zColl;.         
6b30: 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e     IdList *pUsin
6b40: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  g;.            c
6b50: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
6b60: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6b70: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
6b80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
6b90: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
6ba0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6bb0: 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d  >pSchema = pTab-
6bc0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
6bd0: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
6be0: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
6bf0: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
6c00: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
6c10: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
6c20: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6c30: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
6c40: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
6c50: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6c60: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
6c70: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
6c80: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
6c90: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
6ca0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
6cb0: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
6cc0: 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20  zColl,-1, 0);.  
6cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
6ce0: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
6cf0: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6d10: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
6d20: 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66  urred in the lef
6d30: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74  t table of a nat
6d40: 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20  ural join,.     
6d50: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e           ** then
6d60: 20 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20   skip the right 
6d70: 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61  table to avoid a
6d80: 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68   duplicate match
6d90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6da0: 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20    pItem++;.     
6db0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
6dc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6dd0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55 73          if( (pUs
6de0: 69 6e 67 20 3d 20 70 49 74 65 6d 2d 3e 70 55 73  ing = pItem->pUs
6df0: 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ing)!=0 ){.     
6e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
6e10: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73  his match occurs
6e20: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61   on a column tha
6e30: 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e  t is in the USIN
6e40: 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  G clause.       
6e50: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a         ** of a j
6e60: 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65  oin, skip the se
6e70: 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68  arch of the righ
6e80: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
6e90: 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  oin.            
6ea0: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20    ** to avoid a 
6eb0: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
6ec0: 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20  there. */.      
6ed0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
6ef0: 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e  (k=0; k<pUsing->
6f00: 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  nId; k++){.     
6f10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
6f20: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55  qlite3StrICmp(pU
6f30: 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65  sing->a[k].zName
6f40: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f60: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
6f70: 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6fa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6fd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ff0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7000: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7010: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
7020: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e   /* If we have n
7030: 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c  ot already resol
7040: 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68  ved the name, th
7050: 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a  en maybe .    **
7060: 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f   it is a new.* o
7070: 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20  r old.* trigger 
7080: 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e  argument referen
7090: 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ce.    */.    if
70a0: 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62  ( zDb==0 && zTab
70b0: 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26  !=0 && cnt==0 &&
70c0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
70d0: 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ck!=0 ){.      T
70e0: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72  riggerStack *pTr
70f0: 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61  iggerStack = pPa
7100: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
7110: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7120: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
7130: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
7140: 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20  newIdx != -1 && 
7150: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
7160: 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30  new", zTab) == 0
7170: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
7180: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
7190: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
71a0: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
71b0: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
71c0: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
71d0: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
71e0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
71f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
7200: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
7210: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
7220: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64  ite3StrICmp("old
7230: 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20  ", zTab)==0 ){. 
7240: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
7250: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
7260: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20  tack->oldIdx;.  
7270: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
7280: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
7290: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  b );.        pTa
72a0: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
72b0: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d  k->pTab;.      }
72c0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
72d0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74   ){ .        int
72e0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43   iCol;.        C
72f0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54  olumn *pCol = pT
7300: 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20  ab->aCol;..     
7310: 20 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d     pExpr->pSchem
7320: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
7330: 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61  a;.        cntTa
7340: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  b++;.        for
7350: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20  (iCol=0; iCol < 
7360: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
7370: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
7380: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7390: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
73a0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
73b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
73c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
73d0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
73e0: 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col].zColl;.    
73f0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
7400: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7410: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
7420: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
7430: 2d 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20  -1 : iCol;.     
7440: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
7450: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
7460: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
7470: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
7480: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
7490: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
74a0: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
74b0: 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20  Coll,-1, 0);.   
74c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
74d0: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
74e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
74f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7500: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7510: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
7520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7530: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a  IT_TRIGGER) */..
7540: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65      /*.    ** Pe
7550: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
7560: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
7570: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a   the ROWID.    *
7580: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
7590: 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26   && cntTab==1 &&
75a0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
75b0: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63  zCol) ){.      c
75c0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45  nt = 1;.      pE
75d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
75e0: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
75f0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
7600: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
7610: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
7620: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
7630: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
7640: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
7650: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
7660: 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68  me Z.    ** migh
7670: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
7680: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
7690: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
76a0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
76b0: 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72  .    ** we are r
76c0: 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69  esolving names i
76d0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
76e0: 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
76f0: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20  ing command:.   
7700: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
7710: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46  ELECT a+b AS x F
7720: 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20  ROM table WHERE 
7730: 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  x<10;.    **.   
7740: 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b   ** In cases lik
7750: 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20  e this, replace 
7760: 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70  pExpr with a cop
7770: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
7780: 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ion that.    ** 
7790: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
77a0: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
77b0: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
77c0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
77d0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
77e0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
77f0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
7800: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
7810: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
7820: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f  been.    ** reso
7830: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
7840: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
7850: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
7860: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
7870: 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20  t==0 && (pEList 
7880: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d  = pNC->pEList)!=
7890: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a  0 && zTab==0 ){.
78a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
78b0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
78c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
78d0: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
78e0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
78f0: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
7900: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
7910: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
7920: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
7930: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
7940: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
7950: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
7960: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
7970: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
7980: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
7990: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
79a0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
79b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
79c0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
79d0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  pr);.          c
79e0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
79f0: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
7a00: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
7a10: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
7a20: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a  okupname_end_2;.
7a30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7a40: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
7a50: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
7a60: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
7a70: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
7a80: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
7a90: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
7aa0: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
7ab0: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
7ac0: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
7ad0: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
7ae0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
7af0: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
7b00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
7b10: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
7b20: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
7b30: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
7b40: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
7b50: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
7b60: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
7b70: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
7b80: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
7b90: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
7ba0: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
7bb0: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
7bc0: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
7bd0: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
7be0: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
7bf0: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
7c00: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
7c10: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
7c20: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
7c30: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
7c40: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
7c50: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
7c60: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
7c70: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
7c80: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
7c90: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
7ca0: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
7cb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
7cc0: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
7cd0: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
7ce0: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
7cf0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
7d00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7d10: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
7d20: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
7d30: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
7d40: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
7d50: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
7d60: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
7d70: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
7d80: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
7d90: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
7da0: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72  t!=1 ){.    char
7db0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61   *z = 0;.    cha
7dc0: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72  r *zErr;.    zEr
7dd0: 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f  r = cnt==0 ? "no
7de0: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73   such column: %s
7df0: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
7e00: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b  olumn name: %s";
7e10: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
7e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
7e30: 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20  String(&z, zDb, 
7e40: 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ".", zTab, ".", 
7e50: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
7e60: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
7e70: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
7e80: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7e90: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
7ea0: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
7eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
7ec0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
7ed0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
7ee0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7ef0: 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a  (pParse, zErr, z
7f00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
7f10: 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43  e(z);.    pTopNC
7f20: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nErr++;.  }.. 
7f30: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
7f40: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20  from a table in 
7f50: 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65  pSrcList is refe
7f60: 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63  renced, then rec
7f70: 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ord.  ** this fa
7f80: 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69  ct in the pSrcLi
7f90: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62  st.a[].colUsed b
7fa0: 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20  itmask.  Column 
7fb0: 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69  0 causes.  ** bi
7fc0: 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20  t 0 to be set.  
7fd0: 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69  Column 1 sets bi
7fe0: 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  t 1.  And so for
7ff0: 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  th.  If the.  **
8000: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
8010: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
8020: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
8030: 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  s in the bitmask
8040: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74  .  ** then set t
8050: 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
8060: 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  t of the bitmask
8070: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
8080: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
8090: 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20  & pMatch!=0 ){. 
80a0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
80b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->iColumn;.    i
80c0: 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74  f( n>=sizeof(Bit
80d0: 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20  mask)*8 ){.     
80e0: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d   n = sizeof(Bitm
80f0: 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a  ask)*8-1;.    }.
8100: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74      assert( pMat
8110: 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78  ch->iCursor==pEx
8120: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
8130: 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65    pMatch->colUse
8140: 64 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a  d |= 1<<n;.  }..
8150: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a  lookupname_end:.
8160: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
8170: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
8180: 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b  sqliteFree(zDb);
8190: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
81a0: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ab);.  sqlite3Ex
81b0: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
81c0: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
81d0: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
81e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
81f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8200: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
8210: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
8220: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f   = TK_COLUMN;.lo
8230: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a  okupname_end_2:.
8240: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
8250: 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31  l);.  if( cnt==1
8260: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8270: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  pNC!=0 );.    sq
8280: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
8290: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43  arse, pExpr, pNC
82a0: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
82b0: 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21   if( pMatch && !
82c0: 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20  pMatch->pSelect 
82d0: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
82e0: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
82f0: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  Tab;.    }.    /
8300: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
8310: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
8320: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
8330: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
8340: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
8350: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
8360: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
8370: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
8380: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
8390: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
83a0: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
83b0: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
83c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
83d0: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
83e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
83f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
8400: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
8410: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
8420: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8430: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
8440: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
8450: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
8460: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
8470: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
8480: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
8490: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
84a0: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
84b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
84c0: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
84d0: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
84e0: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
84f0: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
8500: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
8510: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8520: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
8530: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
8540: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
8550: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
8560: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
8570: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
8580: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
8590: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
85a0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
85b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
85c0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
85d0: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
85e0: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
85f0: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
8600: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
8610: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8620: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
8630: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
8640: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
8650: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
8660: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
8670: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
8680: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
8690: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
86a0: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
86b0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
86c0: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
86d0: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
86e0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
86f0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
8700: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
8710: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
8720: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
8730: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
8740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
8750: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
8760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
8770: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
8780: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
8790: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
87a0: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
87b0: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
87c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
87d0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
87e0: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
87f0: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
8800: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
8810: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
8820: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
8830: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
8840: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
8850: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
8860: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
8870: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
8880: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
8890: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
88a0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
88b0: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
88c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
88d0: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
88e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
88f0: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
8900: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
8910: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
8920: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
8930: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
8940: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
8950: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
8960: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
8970: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
8980: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
8990: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
89a0: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
89b0: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
89c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
89d0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
89e0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
89f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
8a00: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
8a10: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
8a20: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
8a30: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
8a40: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
8a50: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
8a60: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
8a70: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
8a80: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
8a90: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
8aa0: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
8ab0: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
8ac0: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
8ad0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
8ae0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
8af0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
8b00: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
8b10: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
8b20: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
8b30: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
8b40: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
8b50: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
8b60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
8b80: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
8b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
8ba0: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
8bb0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8bc0: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
8bd0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
8be0: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
8bf0: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
8c00: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
8c10: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
8c20: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
8c30: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
8c40: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
8c50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8c60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
8c70: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
8c80: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
8c90: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
8ca0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
8cb0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
8cc0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8cd0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
8ce0: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
8cf0: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
8d00: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
8d10: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
8d20: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
8d30: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8d40: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
8d50: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
8d60: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
8d70: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
8d80: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
8d90: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
8da0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8db0: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
8dc0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8dd0: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
8de0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8df0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
8e00: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
8e10: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
8e20: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
8e30: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
8e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8e50: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
8e60: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
8e70: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
8e80: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
8e90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
8ea0: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
8eb0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
8ec0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
8ed0: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
8ee0: 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69  about the functi
8ef0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
8f00: 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
8f10: 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65 20 64  ->db);  /* The d
8f20: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
8f30: 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d   */..      zId =
8f40: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
8f50: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
8f60: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
8f70: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
8f80: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
8f90: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
8fa0: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e   zId, nId, n, en
8fb0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  c, 0);.      if(
8fc0: 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
8fd0: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
8fe0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
8ff0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
9000: 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29  nId, -1, enc, 0)
9010: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
9020: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
9030: 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20     no_such_func 
9040: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
9050: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72  se{.          wr
9060: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31  ong_num_args = 1
9070: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9090: 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e   is_agg = pDef->
90a0: 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20  xFunc==0;.      
90b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
90c0: 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f  gg && !pNC->allo
90d0: 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  wAgg ){.        
90e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
90f0: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
9100: 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
9110: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e  ction %.*s()", n
9120: 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  Id,zId);.       
9130: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
9140: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
9150: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9160: 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29  ( no_such_func )
9170: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9180: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9190: 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  , "no such funct
91a0: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c  ion: %.*s", nId,
91b0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
91c0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
91d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e    }else if( wron
91e0: 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20  g_num_args ){.  
91f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9200: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72  orMsg(pParse,"wr
9210: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
9220: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
9230: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20  ion %.*s()",.   
9240: 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a            nId, z
9250: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
9260: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
9270: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
9280: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  gg ){.        pE
9290: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
92a0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
92b0: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
92c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
92d0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
92e0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  NC->allowAgg = 0
92f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9300: 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26   pNC->nErr==0 &&
9310: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
9320: 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65      walkExprTree
9330: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
9340: 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  pr, nameResolver
9350: 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20  Step, pNC);.    
9360: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
9370: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
9380: 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  wAgg = 1;.      
9390: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70  /* FIX ME:  Comp
93a0: 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ute pExpr->affin
93b0: 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ity based on the
93c0: 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e   expected return
93d0: 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f  .      ** type o
93e0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a  f the function .
93f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
9400: 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20  eturn is_agg;.  
9410: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9420: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9430: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
9440: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
9450: 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a  _EXISTS:.#endif.
9460: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
9470: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
9480: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
9490: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d        int nRef =
94a0: 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e   pNC->nRef;.#ifn
94b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
94c0: 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20 69 66  CHECK.        if
94d0: 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29  ( pNC->isCheck )
94e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
94f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9500: 73 65 2c 22 73 75 62 71 75 65 72 69 65 73 20 70  se,"subqueries p
9510: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45  rohibited in CHE
9520: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  CK constraints")
9530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
9540: 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  if.        sqlit
9550: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
9560: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9570: 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20  Select, pNC);.  
9580: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
9590: 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b  C->nRef>=nRef );
95a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65  .        if( nRe
95b0: 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a  f!=pNC->nRef ){.
95c0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
95d0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
95e0: 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a   EP_VarSelect);.
95f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9600: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9610: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
9620: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
9630: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
9640: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  BLE: {.      if(
9650: 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b   pNC->isCheck ){
9660: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9670: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9680: 22 70 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68  "parameters proh
9690: 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20  ibited in CHECK 
96a0: 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
96b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
96c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
96d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
96e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
96f0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
9700: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
9710: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
9720: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
9730: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f  ble columns.  No
9740: 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  des of the form 
9750: 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f  ID.ID or ID reso
9760: 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69  lve into an.** i
9770: 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c  ndex to the tabl
9780: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
9790: 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e  ist and a column
97a0: 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a   offset.  The .*
97b0: 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f  * Expr.opcode fo
97c0: 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20  r such nodes is 
97d0: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
97e0: 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e  LUMN.  The Expr.
97f0: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
9800: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
9810: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  e index of the r
9820: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
9830: 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70  in pTabList.** p
9840: 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76  lus the "base" v
9850: 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20  alue.  The base 
9860: 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d  value will ultim
9870: 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65  ately become the
9880: 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20  .** VDBE cursor 
9890: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72  number for a cur
98a0: 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
98b0: 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65  ting into the re
98c0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c  ferenced.** tabl
98d0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
98e0: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68  lumn value is ch
98f0: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
9900: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
9910: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65   .** of the refe
9920: 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54  renced table.  T
9930: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
9940: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70  value for the sp
9950: 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63  ecial.** ROWID c
9960: 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e  olumn is -1.  An
9970: 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  y INTEGER PRIMAR
9980: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20  Y KEY column is 
9990: 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61  tried as an.** a
99a0: 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a  lias for ROWID..
99b0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f 6c  **.** Also resol
99c0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
99d0: 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65 20  s and check the 
99e0: 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70 72  functions for pr
99f0: 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20 20  oper.** usage.  
9a00: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66 75  Make sure all fu
9a10: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65  nction names are
9a20: 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
9a30: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  all functions.**
9a40: 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65 63   have the correc
9a50: 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  t number of argu
9a60: 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e  ments.  Leave an
9a70: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
9a80: 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  * in pParse->zEr
9a90: 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e 67  rMsg if anything
9aa0: 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75   is amiss.  Retu
9ab0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9ac0: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
9ad0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67   contains aggreg
9af0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ate functions th
9b00: 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41 67  en set the EP_Ag
9b10: 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e  g.** property on
9b20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
9b30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9b40: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
9b50: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
9b60: 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61  pNC,       /* Na
9b70: 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c  mespace to resol
9b80: 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ve expressions i
9b90: 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  n. */.  Expr *pE
9ba0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
9bb0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
9bc0: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
9bd0: 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61  . */.){.  int sa
9be0: 76 65 64 48 61 73 41 67 67 3b 0a 20 20 69 66 28  vedHasAgg;.  if(
9bf0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
9c00: 72 6e 20 30 3b 0a 20 20 73 61 76 65 64 48 61 73  rn 0;.  savedHas
9c10: 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67  Agg = pNC->hasAg
9c20: 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67  g;.  pNC->hasAgg
9c30: 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 0;.  walkExpr
9c40: 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65  Tree(pExpr, name
9c50: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
9c60: 43 29 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e  C);.  if( pNC->n
9c70: 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  Err>0 ){.    Exp
9c80: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
9c90: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20  pr, EP_Error);. 
9ca0: 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61   }.  if( pNC->ha
9cb0: 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72  sAgg ){.    Expr
9cc0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
9cd0: 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65  r, EP_Agg);.  }e
9ce0: 6c 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73  lse if( savedHas
9cf0: 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  Agg ){.    pNC->
9d00: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  hasAgg = 1;.  }.
9d10: 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
9d20: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
9d30: 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a  EP_Error);.}../*
9d40: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e  .** A pointer in
9d50: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
9d60: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
9d70: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
9d80: 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  tion.** through 
9d90: 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74  walkExprTree int
9da0: 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79 53 74  o codeSubquerySt
9db0: 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ep()..*/.typedef
9dc0: 20 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64   struct QueryCod
9dd0: 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73  er QueryCoder;.s
9de0: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
9df0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
9e00: 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se;       /* The
9e10: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
9e20: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
9e30: 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  t *pNC;    /* Na
9e40: 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72 73 74  mespace of first
9e50: 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79   enclosing query
9e60: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47   */.};.../*.** G
9e70: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
9e80: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
9e90: 65 73 20 75 73 65 64 20 61 73 20 61 6e 20 65 78  es used as an ex
9ea0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20  pression.** and 
9eb0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
9ec0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
9ed0: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
9ee0: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
9ef0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
9f00: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
9f10: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
9f20: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
9f30: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
9f40: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
9f50: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
9f60: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
9f70: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
9f80: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
9f90: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
9fa0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
9fb0: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
9fc0: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
9fd0: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
9fe0: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
9ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
a000: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
a010: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
a020: 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66  subquery..*/.#if
a030: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a040: 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73  _SUBQUERY.void s
a050: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
a060: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
a070: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
a080: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
a090: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a0b0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
a0c0: 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ess */.  Vdbe *v
a0d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a0e0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
a0f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
a100: 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
a110: 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69  must be run in i
a120: 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72  ts entirety ever
a130: 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  y time it is enc
a140: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66  ountered.  ** if
a150: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
a160: 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
a170: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
a180: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
a190: 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
a1a0: 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
a1b0: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
a1c0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
a1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a1e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
a1f0: 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
a200: 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
a210: 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
a220: 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
a230: 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
a240: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
a250: 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
a260: 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
a270: 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
a280: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
a290: 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
a2a0: 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
a2b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
a2c0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
a2d0: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
a2e0: 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65  lect) && !pParse
a2f0: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
a300: 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61     int mem = pPa
a310: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
a320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a330: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
a340: 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65   mem, 0);.    te
a350: 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  stAddr = sqlite3
a360: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a370: 49 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61  If, 0, 0);.    a
a380: 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e  ssert( testAddr>
a390: 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  0 || sqlite3Mall
a3a0: 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20  ocFailed() );.  
a3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a3c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
a3d0: 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20   1, mem);.  }.. 
a3e0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
a3f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a400: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
a410: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
a420: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
a430: 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  fo;.      int ad
a440: 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64  dr;        /* Ad
a450: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
a460: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
a470: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
a480: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
a490: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
a4a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
a4b0: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
a4c0: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
a4d0: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
a4e0: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
a4f0: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
a500: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
a510: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
a520: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
a530: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
a540: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
a550: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
a560: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
a570: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
a580: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
a590: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
a5a0: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
a5b0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
a5c0: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
a5d0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
a5e0: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
a5f0: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
a600: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
a610: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
a620: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
a630: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
a640: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
a650: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
a660: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
a670: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
a680: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
a690: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
a6a0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
a6b0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a6c0: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
a6d0: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
a6e0: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
a6f0: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
a700: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
a710: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
a720: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
a730: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
a740: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
a750: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
a760: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
a770: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
a780: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
a790: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a7a0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a7b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a7c0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
a7d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
a7e0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
a7f0: 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  &keyInfo, 0, siz
a800: 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20  eof(keyInfo));. 
a810: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69       keyInfo.nFi
a820: 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eld = 1;.      s
a830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a840: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
a850: 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  mns, pExpr->iTab
a860: 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69  le, 1);..      i
a870: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
a880: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
a890: 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72  Case 1:     expr
a8a0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
a8b0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
a8c0: 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
a8d0: 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
a8e0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
a8f0: 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
a900: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
a910: 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
a920: 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
a930: 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
a940: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
a950: 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54  Parm = pExpr->iT
a960: 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61  able +  (((int)a
a970: 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20  ffinity)<<16);. 
a980: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
a990: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  *pEList;.       
a9a0: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
a9b0: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
a9c0: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
a9d0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  le );.        sq
a9e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
a9f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
aa00: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61  ct, SRT_Set, iPa
aa10: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  rm, 0, 0, 0, 0);
aa20: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
aa30: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
aa40: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
aa50: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
aa60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
aa70: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65  ){ .          ke
aa80: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
aa90: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f   binaryCompareCo
aaa0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
aab0: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
aac0: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
aad0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
aae0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
aaf0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
ab00: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
ab10: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
ab20: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
ab30: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a  t).        **..*
ab40: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
ab50: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
ab60: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
ab70: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
ab80: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
ab90: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
aba0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
abb0: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
abc0: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
abd0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
abe0: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
abf0: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
ac00: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
ac10: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
ac20: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
ac30: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
ac40: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
ac50: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
ac60: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
ac70: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
ac80: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
ac90: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
aca0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20  tem *pItem;..   
acb0: 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
acc0: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
acd0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
ace0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
acf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65      }.        ke
ad00: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
ad10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70   pExpr->pLeft->p
ad20: 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f  Coll;..        /
ad30: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
ad40: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
ad50: 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
ad60: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
ad70: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
ad80: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
ad90: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
ada0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
adb0: 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
adc0: 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  xpr;..          
add0: 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
ade0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
adf0: 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
ae00: 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
ae10: 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
ae20: 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
ae30: 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
ae40: 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
ae50: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
ae60: 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
ae70: 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
ae80: 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
ae90: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
aea0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
aeb0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
aec0: 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
aed0: 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
aee0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
aef0: 20 74 65 73 74 41 64 64 72 3e 30 20 26 26 20 21   testAddr>0 && !
af00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
af10: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
af20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
af30: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
af40: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c  p(v, testAddr-1,
af50: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
af60: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20   testAddr = 0;. 
af70: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
af80: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
af90: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
afa0: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
afb0: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
afc0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
afd0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
afe0: 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20  pParse, pE2);.  
aff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b000: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
b010: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26  eRecord, 1, 0, &
b020: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
b030: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b040: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b050: 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
b060: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
b070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b090: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
b0a0: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
b0b0: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
b0c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b0d0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
b0e0: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
b0f0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
b100: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
b110: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
b120: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
b130: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
b140: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
b150: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
b160: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
b170: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
b180: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
b190: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
b1a0: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
b1b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
b1c0: 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  atic const Token
b1d0: 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31   one = { (u8*)"1
b1e0: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
b1f0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
b200: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20       int iMem;. 
b210: 20 20 20 20 20 69 6e 74 20 73 6f 70 3b 0a 0a 20       int sop;.. 
b220: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
b230: 75 6d 6e 20 3d 20 69 4d 65 6d 20 3d 20 70 50 61  umn = iMem = pPa
b240: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
b250: 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
b260: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
b270: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b280: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
b290: 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 4d 65      sop = SRT_Me
b2a0: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
b2b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b2c0: 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c  P_MemNull, iMem,
b2d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
b2e0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
b2f0: 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
b300: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
b310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 6f  else{.        so
b320: 70 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  p = SRT_Exists;.
b330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b350: 65 6d 49 6e 74 2c 20 30 2c 20 69 4d 65 6d 29 3b  emInt, 0, iMem);
b360: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
b370: 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e 69 74  ment((v, "# Init
b380: 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
b390: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b3a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
b3b0: 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  te(pSel->pLimit)
b3c0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
b3d0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
b3e0: 70 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  pr(TK_INTEGER, 0
b3f0: 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20  , 0, &one);.    
b400: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
b410: 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f  pParse, pSel, so
b420: 70 2c 20 69 4d 65 6d 2c 20 30 2c 20 30 2c 20 30  p, iMem, 0, 0, 0
b430: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
b440: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
b450: 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a  if( testAddr ){.
b460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b470: 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41  umpHere(v, testA
b480: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ddr);.  }.  retu
b490: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
b4a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b4b0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  UERY */../*.** G
b4c0: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
b4d0: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
b4e0: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
b4f0: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
b500: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f  text z[0..n-1] o
b510: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  n the stack..*/.
b520: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
b530: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
b540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
b550: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
b560: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65  .  if( sqlite3Ge
b570: 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b  tInt32(z, &i) ){
b580: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b590: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b5a0: 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65  ger, i, 0);.  }e
b5b0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
b5c0: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29  itsIn64Bits(z) )
b5d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b5e0: 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34  eOp3(v, OP_Int64
b5f0: 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20  , 0, 0, z, n);. 
b600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
b610: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
b620: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
b630: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
b640: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
b650: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
b660: 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
b670: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
b680: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
b690: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e  ve the result on
b6a0: 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63   the top of stac
b6b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  k..**.** This co
b6c0: 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
b6d0: 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
b6e0: 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
b6f0: 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
b700: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
b710: 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
b720: 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
b730: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
b740: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
b750: 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
b760: 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
b770: 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
b780: 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
b790: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
b7a0: 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
b7b0: 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
b7c0: 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
b7d0: 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
b7e0: 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
b7f0: 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
b800: 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
b810: 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
b820: 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
b830: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
b840: 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65   *pExpr){.  Vdbe
b850: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
b860: 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20  dbe;.  int op;. 
b870: 20 69 6e 74 20 73 74 61 63 6b 43 68 6e 67 20 3d   int stackChng =
b880: 20 31 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74   1;    /* Amount
b890: 20 6f 66 20 63 68 61 6e 67 65 20 74 6f 20 73 74   of change to st
b8a0: 61 63 6b 20 64 65 70 74 68 20 2a 2f 0a 0a 20 20  ack depth */..  
b8b0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
b8c0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  n;.  if( pExpr==
b8d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b8e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b8f0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
b900: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
b910: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
b920: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
b930: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
b940: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
b950: 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
b960: 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
b970: 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
b980: 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
b990: 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
b9a0: 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
b9b0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
b9c0: 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
b9d0: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  de ){.        sq
b9e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b9f0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 43  , OP_MemLoad, pC
ba00: 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  ol->iMem, 0);.  
ba10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
ba30: 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
ba40: 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
ba50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ba60: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
ba70: 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
ba80: 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
bab0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
bac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
bad0: 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
bae0: 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
baf0: 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
bb00: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
bb10: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
bb20: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
bb30: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
bb40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
bb50: 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
bb60: 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
bb70: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
bb80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bb90: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
bba0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  >0 );.        sq
bbb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bbc0: 2c 20 4f 50 5f 44 75 70 2c 20 70 50 61 72 73 65  , OP_Dup, pParse
bbd0: 2d 3e 63 6b 4f 66 66 73 65 74 2d 70 45 78 70 72  ->ckOffset-pExpr
bbe0: 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31 29 3b  ->iColumn-1, 1);
bbf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
bc00: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
bc10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 61  =0 ){.        Ta
bc20: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
bc30: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
bc40: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
bc50: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
bc60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc70: 64 64 4f 70 28 76 2c 20 70 54 61 62 2d 3e 69 73  ddOp(v, pTab->is
bc80: 56 69 72 74 75 61 6c 20 3f 20 4f 50 5f 56 43 6f  Virtual ? OP_VCo
bc90: 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
bca0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
bcc0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 69 43 6f  xpr->iTable, iCo
bcd0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
bce0: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
bcf0: 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 29 3b  (v, pTab, iCol);
bd00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bd10: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
bd20: 49 4e 54 0a 20 20 20 20 20 20 20 20 69 66 28 20  INT.        if( 
bd30: 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 61 43  pTab && pTab->aC
bd40: 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
bd50: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
bd60: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
bd70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bd80: 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  (v, OP_RealAffin
bd90: 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ity, 0, 0);.    
bda0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
bdb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bdc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bdd0: 4f 70 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61  Op(v, pExpr->pTa
bde0: 62 2d 3e 69 73 56 69 72 74 75 61 6c 20 3f 20 4f  b->isVirtual ? O
bdf0: 50 5f 56 52 6f 77 69 64 20 3a 20 4f 50 5f 52 6f  P_VRowid : OP_Ro
be00: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
be20: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
be30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
be40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
be50: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
be60: 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
be70: 65 67 65 72 28 76 2c 20 28 63 68 61 72 2a 29 70  eger(v, (char*)p
be80: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
be90: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
bea0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
beb0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
bec0: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
bed0: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
bee0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f    assert( TK_FLO
bef0: 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20  AT==OP_Real );. 
bf00: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
bf10: 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e  STRING==OP_Strin
bf20: 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g8 );.      sqli
bf30: 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70  te3DequoteExpr(p
bf40: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
bf50: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f  ite3VdbeOp3(v, o
bf60: 70 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  p, 0, 0, (char*)
bf70: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
bf80: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
bf90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bfa0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bfb0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
bfc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bfd0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
bfe0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bff0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
c000: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
c010: 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
c020: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
c030: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
c040: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
c050: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f    assert( TK_BLO
c060: 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b  B==OP_HexBlob );
c070: 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70 72  .      n = pExpr
c080: 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a 20  ->token.n - 3;. 
c090: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29       z = (char*)
c0a0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b  pExpr->token.z +
c0b0: 20 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   2;.      assert
c0c0: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( n>=0 );.      
c0d0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
c0e0: 20 20 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20      z = "";.    
c0f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c100: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
c110: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  0, 0, z, n);.   
c120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c130: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
c140: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
c150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c160: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69  AddOp(v, OP_Vari
c170: 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61  able, pExpr->iTa
c180: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ble, 0);.      i
c190: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
c1a0: 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  n>1 ){.        s
c1b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c1c0: 50 33 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P3(v, -1, (char*
c1d0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
c1e0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
c1f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c200: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c210: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
c220: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
c230: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c240: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
c250: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
c260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c270: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c280: 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
c290: 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
c2a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c2b0: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
c2c0: 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
c2d0: 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
c2e0: 69 6e 74 20 61 66 66 2c 20 74 6f 5f 6f 70 3b 0a  int aff, to_op;.
c2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c300: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c310: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
c320: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
c330: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
c340: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  xpr->token);.   
c350: 20 20 20 74 6f 5f 6f 70 20 3d 20 61 66 66 20 2d     to_op = aff -
c360: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
c370: 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b 0a 20 20   + OP_ToText;.  
c380: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
c390: 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
c3a0: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
c3b0: 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
c3c0: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
c3d0: 70 3d 3d 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20  p==OP_ToBlob    
c3e0: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
c3f0: 46 46 5f 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20  FF_NONE    );.  
c400: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
c410: 70 3d 3d 4f 50 5f 54 6f 4e 75 6d 65 72 69 63 20  p==OP_ToNumeric 
c420: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
c430: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
c440: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
c450: 70 3d 3d 4f 50 5f 54 6f 49 6e 74 20 20 20 20 20  p==OP_ToInt     
c460: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
c470: 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
c480: 20 20 20 20 61 73 73 65 72 74 28 20 74 6f 5f 6f      assert( to_o
c490: 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c 20 20 20 20  p==OP_ToReal    
c4a0: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
c4b0: 46 46 5f 52 45 41 4c 20 20 20 20 29 3b 0a 20 20  FF_REAL    );.  
c4c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c4d0: 64 64 4f 70 28 76 2c 20 74 6f 5f 6f 70 2c 20 30  ddOp(v, to_op, 0
c4e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
c4f0: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
c500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
c510: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c520: 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20  MIT_CAST */.    
c530: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
c540: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
c550: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
c560: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
c570: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
c580: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
c590: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
c5a0: 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
c5b0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
c5c0: 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
c5d0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
c5e0: 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
c5f0: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
c600: 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
c610: 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
c620: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c630: 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
c640: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c650: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c660: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
c670: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c680: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c690: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
c6a0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
c6b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
c6c0: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
c6d0: 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  ht, op, 0, 0);. 
c6e0: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
c6f0: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
c700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c710: 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
c720: 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
c730: 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
c740: 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
c750: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
c760: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
c770: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
c780: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
c790: 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
c7a0: 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
c7b0: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
c7c0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
c7d0: 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
c7e0: 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
c7f0: 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
c800: 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
c810: 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
c820: 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
c830: 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
c840: 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
c850: 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
c860: 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
c870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c880: 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
c890: 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
c8a0: 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
c8b0: 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
c8c0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
c8d0: 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
c8e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c8f0: 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
c900: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
c910: 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
c920: 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
c930: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
c940: 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
c950: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
c960: 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
c970: 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
c980: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c990: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c9a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
c9b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c9c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c9d0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
c9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c9f0: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
ca00: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
ca10: 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
ca20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ca30: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
ca40: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
ca50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
ca60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
ca70: 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
ca80: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
ca90: 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70  OAT || pLeft->op
caa0: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
cab0: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70          Token *p
cac0: 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e   = &pLeft->token
cad0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
cae0: 7a 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  z = sqlite3MPrin
caf0: 74 66 28 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e  tf("-%.*s", p->n
cb00: 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  , p->z);.       
cb10: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
cb20: 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
cb30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cb40: 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  eOp3(v, OP_Real,
cb50: 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31   0, 0, z, p->n+1
cb60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
cb70: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65  {.          code
cb80: 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d  Integer(v, z, p-
cb90: 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  >n+1);.        }
cba0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
cbb0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  ree(z);.        
cbc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
cbd0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
cbe0: 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54  ough into TK_NOT
cbf0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
cc00: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
cc10: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
cc20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
cc30: 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
cc40: 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Not );.      ass
cc50: 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
cc60: 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Not );.      sql
cc70: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
cc80: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
cc90: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
cca0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
ccb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
ccc0: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
ccd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cce0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
ccf0: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
cd00: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
cd10: 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20    int dest;.    
cd20: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
cd30: 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
cd40: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cd50: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
cd60: 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
cd70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cd80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
cd90: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
cda0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
cdb0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
cdc0: 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d  t);.      dest =
cdd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
cde0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a  entAddr(v) + 2;.
cdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ce00: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
ce10: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
ce20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ce30: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
ce40: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
ce50: 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Chng = 0;.      
ce60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ce70: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
ce80: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
ce90: 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
cea0: 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
ceb0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
cec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
ced0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
cee0: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
cef0: 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54 22  f aggregate: %T"
cf00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70  ,.            &p
cf10: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
cf20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cf40: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
cf50: 2c 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  , pInfo->aFunc[p
cf60: 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
cf70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
cf80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cf90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
cfa0: 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61 73  ST_FUNC:.    cas
cfb0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
cfc0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
cfd0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
cfe0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
cff0: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20 3f   nExpr = pList ?
d000: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
d010: 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  0;.      FuncDef
d020: 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69 6e   *pDef;.      in
d030: 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e  t nId;.      con
d040: 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20  st char *zId;.  
d050: 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61 73      int constMas
d060: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  k = 0;.      int
d070: 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63   i;.      u8 enc
d080: 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
d090: 62 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  b);.      CollSe
d0a0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
d0b0: 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a      zId = (char*
d0c0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b  )pExpr->token.z;
d0d0: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
d0e0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
d0f0: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
d100: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
d110: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
d120: 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20  Id, nExpr, enc, 
d130: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
d140: 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20  ( pDef!=0 );.   
d150: 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74     nExpr = sqlit
d160: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
d170: 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
d180: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
d190: 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33  ; i<nExpr && i<3
d1a0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
d1b0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
d1c0: 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74  IsConstant(pList
d1d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
d1e0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
d1f0: 4d 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a  Mask |= (1<<i);.
d200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d210: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
d220: 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c  CollSeq && !pCol
d230: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
d240: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
d250: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
d260: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
d270: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
d280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d290: 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
d2a0: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Seq ){.        i
d2b0: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
d2c0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
d2d0: 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20  pDfltColl; .    
d2e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
d2f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p3(v, OP_CollSeq
d300: 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
d310: 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45  pColl, P3_COLLSE
d320: 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
d330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
d340: 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
d350: 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78 70   constMask, nExp
d360: 72 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  r, (char*)pDef, 
d370: 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
d380: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31     stackChng = 1
d390: 2d 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 62 72  -nExpr;.      br
d3a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
d3b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
d3c0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
d3d0: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
d3e0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
d3f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
d400: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  r->iColumn==0 ){
d410: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d420: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
d430: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
d440: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d450: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d460: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
d470: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  r->iColumn, 0);.
d480: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
d490: 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75  t((v, "# load su
d4a0: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
d4b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d4c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
d4d0: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
d4e0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61   addr;.      cha
d4f0: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
d500: 20 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d    int ckOffset =
d510: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
d520: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
d530: 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
d540: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20  arse, pExpr);.. 
d550: 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f       /* Figure o
d560: 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
d570: 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
d580: 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
d590: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
d5a0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
d5b0: 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
d5c0: 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
d5d0: 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
d5e0: 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20  for.      ** P3 
d5f0: 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
d600: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d610: 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
d620: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
d630: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71  Expr);..      sq
d640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d650: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
d660: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
d670: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b  e->ckOffset = ck
d680: 4f 66 66 73 65 74 2b 31 3b 0a 0a 20 20 20 20 20  Offset+1;..     
d690: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78   /* Code the <ex
d6a0: 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
d6b0: 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20   IN (...)". The 
d6c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
d6d0: 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e        ** pExpr->
d6e0: 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  iTable contains 
d6f0: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
d700: 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e  make up the (...
d710: 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ) set..      */.
d720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d730: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
d740: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
d750: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d760: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d770: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
d780: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d790: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
d7a0: 64 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20  ddr+4);         
d7b0: 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a     /* addr + 0 *
d7c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
d7d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
d7e0: 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  op, 2, 0);.     
d7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d800: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
d810: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d820: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d830: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b  P_Goto, 0, addr+
d840: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
d850: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
d860: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
d870: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20   &affinity, 1); 
d880: 20 20 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f    /* addr + 4 */
d890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d8a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
d8b0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
d8c0: 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20  le, addr+7);.   
d8d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d8e0: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
d8f0: 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20  , -1, 0);       
d900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
d910: 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20  dr + 6 */..     
d920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
d930: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
d940: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
d950: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
d960: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
d970: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d980: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
d990: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
d9a0: 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
d9b0: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
d9c0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
d9d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d9e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
d9f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da00: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
da10: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
da20: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
da30: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
da40: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
da50: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
da60: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c  Right, OP_Ge, 0,
da70: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
da80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
da90: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
daa0: 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
dab0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
dac0: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
dad0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
dae0: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
daf0: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
db00: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
db10: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
db20: 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Le, 0, 0);.     
db30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
db40: 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20  p(v, OP_And, 0, 
db50: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
db60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
db70: 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
db80: 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
db90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
dba0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
dbb0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
dbc0: 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20  tackChng = 0;.  
dbd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
dbe0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
dbf0: 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  E: {.      int e
dc00: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20  xpr_end_label;. 
dc10: 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73       int jumpIns
dc20: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
dc30: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  pr;.      int i;
dc40: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
dc50: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  *pEList;.      s
dc60: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
dc70: 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a  tem *aListelem;.
dc80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
dc90: 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
dca0: 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
dcb0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  ->pList->nExpr %
dcc0: 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
dcd0: 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
dce0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
dcf0: 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
dd00: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
dd10: 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
dd20: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
dd30: 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
dd40: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
dd50: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20  xpr_end_label = 
dd60: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
dd70: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
dd80: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
dd90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dda0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ddb0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
ddc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ddd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
dde0: 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
ddf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
de00: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
de10: 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  lem[i].pExpr);. 
de20: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
de30: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
de40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
de60: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   1, 1);.        
de70: 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64    jumpInst = cod
de80: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
de90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61   pExpr->pLeft, a
dea0: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
deb0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29      OP_Ne, 0, 1)
dee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
def0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
df00: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
df10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
df20: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
df30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
df40: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
df50: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
df60: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
df70: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
df80: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
df90: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
dfa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dfb0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
dfc0: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
dfd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dfe0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
dff0: 20 6a 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20   jumpInst);.    
e000: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
e010: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
e020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e030: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
e040: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
e050: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
e060: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
e070: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e080: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e090: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
e0a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e0c0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
e0d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e0e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
e0f0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
e100: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
e110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e120: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
e130: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
e140: 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
e150: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
e160: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
e170: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e180: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e190: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
e1a0: 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
e1b0: 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
e1c0: 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
e1d0: 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
e1e0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d  .return;.      }
e1f0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
e200: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
e210: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
e220: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e230: 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
e240: 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
e250: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
e260: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
e270: 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
e280: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
e290: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
e2a0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
e2b0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
e2c0: 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  (pExpr);.       
e2d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
e2e0: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
e2f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
e300: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  pExpr->iColumn,.
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
e330: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
e340: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
e350: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
e360: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e370: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
e380: 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
e390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e3a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
e3b0: 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
e3c0: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
e3d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e3e0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
e3f0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
e400: 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20  noreJump);.     
e410: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e420: 28 76 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e  (v, "# raise(IGN
e430: 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
e440: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
e450: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
e460: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
e470: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73    }..  if( pPars
e480: 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20  e->ckOffset ){. 
e490: 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66     pParse->ckOff
e4a0: 73 65 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67  set += stackChng
e4b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
e4c0: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29  arse->ckOffset )
e4d0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
e4e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
e4f0: 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  GGER./*.** Gener
e500: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
e510: 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
e520: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
e530: 6c 65 61 76 65 73 20 74 68 65 20 72 65 73 75 6c  leaves the resul
e540: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  t.** on the stac
e550: 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  k.  See also sql
e560: 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a  ite3ExprCode()..
e570: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e580: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61  ne might also ca
e590: 63 68 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  che the result a
e5a0: 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45  nd modify the pE
e5b0: 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74  xpr tree.** so t
e5c0: 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65  hat it will make
e5d0: 20 75 73 65 20 6f 66 20 74 68 65 20 63 61 63 68   use of the cach
e5e0: 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  ed result on sub
e5f0: 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69  sequent evaluati
e600: 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ons.** rather th
e610: 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  an evaluate the 
e620: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
e630: 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c   again.  Trivial
e640: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
e650: 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20  .** not cached. 
e660: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
e670: 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20 69 74  on is cached, it
e680: 73 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  s result is stor
e690: 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f  ed in a .** memo
e6a0: 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  ry location..*/.
e6b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
e6c0: 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
e6d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
e6e0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65   *pExpr){.  Vdbe
e6f0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
e700: 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
e710: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
e720: 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dr2;.  if( v==0 
e730: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72  ) return;.  addr
e740: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
e750: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
e760: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e770: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
e780: 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74  .  addr2 = sqlit
e790: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e7a0: 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72  r(v);.  if( addr
e7b0: 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c  2>addr1+1 || sql
e7c0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
e7d0: 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d   addr1)->opcode=
e7e0: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a  =OP_Function ){.
e7f0: 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72      iMem = pExpr
e800: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
e810: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
e820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e830: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
e840: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45  iMem, 0);.    pE
e850: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
e860: 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ISTER;.  }.}.#en
e870: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
e880: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
e890: 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
e8a0: 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
e8b0: 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
e8c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e8d0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
e8e0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
e8f0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
e900: 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
e910: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
e920: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
e930: 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
e940: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e950: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
e960: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
e970: 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68   *pList    /* Th
e980: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
e990: 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
e9a0: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
e9b0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
e9c0: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
e9d0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e9e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
e9f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
ea00: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
ea10: 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d  >a, i=n; i>0; i-
ea20: 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
ea30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ea40: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
ea50: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
ea60: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
ea70: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
ea80: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
ea90: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
eaa0: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
eab0: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
eac0: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
ead0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
eae0: 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
eaf0: 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
eb00: 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
eb10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
eb20: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
eb30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
eb40: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
eb50: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
eb60: 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
eb70: 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
eb80: 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
eb90: 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e  ll flag is true.
eba0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
ebb0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
ebc0: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
ebd0: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
ebe0: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
ebf0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
ec00: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
ec10: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
ec20: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
ec30: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
ec40: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
ec50: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
ec60: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
ec70: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
ec80: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
ec90: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
eca0: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
ecb0: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
ecc0: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
ecd0: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
ece0: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
ecf0: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
ed00: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
ed10: 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
ed20: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
ed30: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
ed40: 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
ed50: 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
ed60: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
ed70: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
ed80: 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50  nt ckOffset = pP
ed90: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a  arse->ckOffset;.
eda0: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
edb0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
edc0: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
edd0: 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
ede0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
edf0: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
ee00: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
ee10: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ee20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ee30: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
ee40: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
ee50: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20   !jumpIfNull);. 
ee60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ee70: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
ee80: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
ee90: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
eea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eeb0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
eec0: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
eed0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
eee0: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
eef0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
ef00: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
ef10: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
ef20: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
ef30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
ef40: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
ef50: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
ef60: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
ef70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ef80: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
ef90: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
efa0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
efb0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
efc0: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
efd0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
efe0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
eff0: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
f000: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
f010: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
f020: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
f030: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
f040: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
f050: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
f060: 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
f070: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
f080: 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
f090: 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
f0a0: 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
f0b0: 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
f0c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f0d0: 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
f0e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f0f0: 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
f100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f110: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f120: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
f130: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f140: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
f150: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
f160: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
f170: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f180: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
f190: 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
f1a0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
f1b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f1c0: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
f1d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
f1e0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
f1f0: 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
f200: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
f210: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
f220: 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
f230: 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
f240: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f250: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
f260: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f270: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
f280: 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
f290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f2a0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
f2b0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
f2c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42   expression "x B
f2d0: 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20  ETWEEN y AND z" 
f2e0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
f2f0: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
f300: 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79    ** 1 IF (x < y
f310: 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
f320: 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20  * 2 IF (x <= z) 
f330: 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
f340: 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20    ** 3 ....     
f350: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
f360: 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  dr;.      Expr *
f370: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
f380: 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
f390: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
f3a0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
f3b0: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
f3c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f3d0: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
f3e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f3f0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
f400: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f410: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f420: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
f430: 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70   addr = codeComp
f440: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
f450: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74  t, pRight, OP_Lt
f460: 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  , 0, !jumpIfNull
f470: 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74  );..      pRight
f480: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
f490: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
f4a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f4b0: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
f4c0: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
f4d0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
f4e0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
f4f0: 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  Le, dest, jumpIf
f500: 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71  Null);..      sq
f510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f520: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
f530: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f540: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f550: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73  , addr);.      s
f560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f570: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
f580: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f590: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f5a0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f5b0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f5c0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
f5d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f5e0: 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49  (v, OP_If, jumpI
f5f0: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
f600: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f610: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63  .  }.  pParse->c
f620: 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73  kOffset = ckOffs
f630: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  et;.}../*.** Gen
f640: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
f650: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
f660: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
f670: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
f680: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
f690: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
f6a0: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
f6b0: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
f6c0: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
f6d0: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
f6e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
f6f0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
f700: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
f710: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
f720: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
f730: 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
f740: 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
f750: 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c   is true or fall
f760: 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
f770: 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e  IfNull is false.
f780: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f790: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
f7a0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
f7b0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
f7c0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
f7d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f7e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f7f0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
f800: 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61  t ckOffset = pPa
f810: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20  rse->ckOffset;. 
f820: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
f830: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
f840: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
f850: 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
f860: 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
f870: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
f880: 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
f890: 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
f8a0: 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
f8b0: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
f8c0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
f8d0: 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
f8e0: 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
f8f0: 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
f900: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
f910: 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
f920: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
f930: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
f940: 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
f950: 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
f960: 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
f970: 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
f980: 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
f990: 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
f9a0: 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
f9b0: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
f9d0: 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
f9e0: 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
f9f0: 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
fa00: 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
fa10: 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
fa20: 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
fa30: 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
fa40: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
fa50: 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
fa60: 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
fa70: 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
fa80: 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
fa90: 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
faa0: 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
fab0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
fac0: 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
fad0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
fae0: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
faf0: 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
fb00: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
fb10: 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
fb20: 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
fb30: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
fb40: 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
fb50: 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
fb60: 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
fb70: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fb80: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
fb90: 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
fba0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
fbb0: 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
fbc0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
fbd0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
fbe0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
fbf0: 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
fc00: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
fc10: 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
fc20: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
fc30: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
fc40: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
fc50: 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
fc60: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
fc70: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
fc80: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
fc90: 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
fca0: 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
fcb0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
fcc0: 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
fcd0: 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
fce0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
fcf0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
fd00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
fd10: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
fd20: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
fd30: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
fd40: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
fd50: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
fd60: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
fd70: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
fd80: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
fd90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fda0: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
fdb0: 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
fdc0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
fdd0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
fde0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
fdf0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
fe00: 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
fe10: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
fe20: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
fe30: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
fe40: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
fe50: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
fe60: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
fe70: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
fe80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fe90: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
fea0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
feb0: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
fec0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
fed0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
fee0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
fef0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ff00: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
ff10: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
ff20: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
ff30: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
ff40: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
ff50: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
ff60: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ff70: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ff80: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
ff90: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ffa0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
ffb0: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
ffc0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
ffd0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
ffe0: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
fff0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
10000 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10010 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10020 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
10030 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
10040 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10050 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
10060 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
10070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10080 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
10090 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
100a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
100b0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
100c0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
100d0 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54  ession is "x BET
100e0 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49  WEEN y AND z". I
100f0 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  t is implemented
10100 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
10110 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e      ** 1 IF (x >
10120 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  = y) GOTO 3.    
10130 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73    ** 2 GOTO <des
10140 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46  t>.      ** 3 IF
10150 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64   (x > z) GOTO <d
10160 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  est>.      */.  
10170 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
10180 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
10190 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
101a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
101b0 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
101c0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
101d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
101e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
101f0 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
10200 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10210 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
10220 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10230 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
10240 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ht);.      addr 
10250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10260 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
10270 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
10280 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
10290 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64  ight, OP_Ge, add
102a0 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  r+3, !jumpIfNull
102b0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
102c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
102d0 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
102e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
102f0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
10300 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
10310 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
10320 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
10330 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
10340 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
10350 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
10360 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
10370 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
10380 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20  t, OP_Gt, dest, 
10390 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
103a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
103b0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
103c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
103d0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
103e0 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
103f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10400 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e  P_IfNot, jumpIfN
10410 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
10420 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10430 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f   }.  pParse->ckO
10440 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74  ffset = ckOffset
10450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20  ;.}../*.** Do a 
10460 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20  deep comparison 
10470 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  of two expressio
10480 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e  n trees.  Return
10490 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
104a0 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20  .** if they are 
104b0 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65  identical and re
104c0 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
104d0 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79  ey differ in any
104e0 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   way..*/.int sql
104f0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
10500 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a  Expr *pA, Expr *
10510 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pB){.  int i;.  
10520 69 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30  if( pA==0||pB==0
10530 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
10540 42 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28  B==pA;.  }.  if(
10550 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20   pA->op!=pB->op 
10560 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10570 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45  ( (pA->flags & E
10580 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42  P_Distinct)!=(pB
10590 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
105a0 74 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20  tinct) ) return 
105b0 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
105c0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
105d0 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
105e0 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
105f0 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
10600 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
10610 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29  ght, pB->pRight)
10620 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10630 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pA->pList ){.
10640 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73      if( pB->pLis
10650 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
10660 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  .    if( pA->pLi
10670 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70  st->nExpr!=pB->p
10680 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65  List->nExpr ) re
10690 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28  turn 0;.    for(
106a0 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74  i=0; i<pA->pList
106b0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
106c0 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
106d0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
106e0 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
106f0 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61  pr, pB->pList->a
10700 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
10710 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10730 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c  }else if( pB->pL
10740 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
10750 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
10760 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42  A->pSelect || pB
10770 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75  ->pSelect ) retu
10780 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
10790 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62  iTable!=pB->iTab
107a0 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d  le || pA->iColum
107b0 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29  n!=pB->iColumn )
107c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
107d0 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a   pA->token.z ){.
107e0 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
107f0 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  n.z==0 ) return 
10800 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74  0;.    if( pB->t
10810 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65  oken.n!=pA->toke
10820 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  n.n ) return 0;.
10830 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
10840 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
10850 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72  A->token.z,(char
10860 2a 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42  *)pB->token.z,pB
10870 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b  ->token.n)!=0 ){
10880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10890 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
108a0 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 1;.}.../*.**
108b0 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
108c0 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
108d0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
108e0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
108f0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
10900 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
10910 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
10920 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
10930 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
10940 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
10950 6c 75 6d 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49  lumn(AggInfo *pI
10960 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
10970 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61   i = sqlite3Arra
10980 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a  yAllocate((void*
10990 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 20  *)&pInfo->aCol, 
109a0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
109b0 6f 6c 5b 30 5d 29 2c 20 33 29 3b 0a 20 20 69 66  ol[0]), 3);.  if
109c0 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( i<0 ){.    ret
109d0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  urn -1;.  }.  re
109e0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
109f0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
10a00 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
10a10 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
10a20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
10a30 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
10a40 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
10a50 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
10a60 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
10a70 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
10a80 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
10a90 6e 66 6f 46 75 6e 63 28 41 67 67 49 6e 66 6f 20  nfoFunc(AggInfo 
10aa0 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
10ab0 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41  ;.  i = sqlite3A
10ac0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f  rrayAllocate((vo
10ad0 69 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e 61 46 75  id**)&pInfo->aFu
10ae0 6e 63 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  nc, sizeof(pInfo
10af0 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 20 32 29 3b  ->aFunc[0]), 2);
10b00 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
10b10 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
10b20 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
10b30 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
10b40 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
10b50 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75 73  alkExprTree() us
10b60 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
10b70 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41  .** sqlite3ExprA
10b80 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
10b90 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
10ba0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
10bb0 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
10bc0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
10bd0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
10be0 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
10bf0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
10c00 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72  unction at pExpr
10c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10c20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
10c30 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
10c40 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
10c50 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
10c60 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f  t *pNC = (NameCo
10c70 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20  ntext *)pArg;.  
10c80 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
10c90 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
10ca0 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
10cb0 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
10cc0 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
10cd0 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
10ce0 67 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69  gInfo;.  ..  swi
10cf0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
10d00 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
10d10 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
10d20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10d30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
10d40 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
10d50 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
10d60 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
10d70 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
10d80 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
10d90 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
10da0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
10db0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
10dc0 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
10dd0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
10de0 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
10df0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
10e00 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
10e10 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
10e20 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
10e30 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
10e40 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
10e50 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
10e60 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
10e70 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
10e80 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
10e90 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
10ea0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
10eb0 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
10ec0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
10ed0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
10ee0 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
10ef0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
10f00 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
10f10 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
10f20 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
10f30 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
10f40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
10f50 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
10f60 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
10f70 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
10f80 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
10f90 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
10fb0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
10fc0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 2c 20 70  >nColumn; i++, p
10fd0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
10fe0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
10ff0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
11000 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
11010 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
11020 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
11030 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
11040 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
11050 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
11060 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
11070 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
11080 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43   i>=pAggInfo->nC
11090 6f 6c 75 6d 6e 20 26 26 20 28 69 20 3d 20 61 64  olumn && (i = ad
110a0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
110b0 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29 7b 0a  AggInfo))>=0 ){.
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
110d0 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
110e0 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
110f0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
11100 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
11110 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
11120 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
11130 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
11140 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
11150 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50   pCol->iMem = pP
11160 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
11170 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
11180 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
11190 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
111a0 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
111b0 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
111c0 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
111d0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
111e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
111f0 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
11200 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
11210 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
11220 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11240 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
11250 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
11260 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
11270 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
11280 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
11290 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
112a0 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
112b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
112c0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
112d0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
112f0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
11300 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
11310 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
11320 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
11330 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
11340 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
11350 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
11370 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
11380 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
11390 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
113a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
113b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
113c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
113d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
113e0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
113f0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
11400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
11410 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
11420 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
11430 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
11440 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
11450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
11460 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
11470 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
11480 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
11490 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
114a0 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
114b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
114c0 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
114d0 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
114e0 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
114f0 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
11500 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
11510 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
11520 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
11530 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
11540 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
11550 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
11560 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
11570 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11580 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
11590 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
115a0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
115b0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
115c0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
115d0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
115e0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
115f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
11600 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
11610 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
11620 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
11630 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
11640 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
11650 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
11660 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
11670 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
11680 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
11690 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e      /* The pNC->
116a0 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63  nDepth==0 test c
116b0 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20  auses aggregate 
116c0 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62  functions in sub
116d0 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a  queries.      **
116e0 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a   to be ignored *
116f0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  /.      if( pNC-
11700 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
11710 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
11720 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
11730 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
11740 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
11750 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
11760 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
11770 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
11780 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
11790 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
117a0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
117b0 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
117c0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
117d0 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
117e0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
117f0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
11800 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
11810 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
11820 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
11830 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
11840 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11870 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
11880 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
11890 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
118a0 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
118b0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
118c0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
118d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
118e0 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
118f0 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
11900 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
11910 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
11920 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
11930 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
11940 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
11950 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
11960 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
11970 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
11980 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
11990 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
119a0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
119b0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
119c0 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
119d0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
119e0 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d     (char*)pExpr-
11a10 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
11a20 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20  >token.n,.      
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
11a40 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70  pr->pList ? pExp
11a50 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
11a60 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  : 0, enc, 0);.  
11a70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
11a80 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
11a90 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
11aa0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
11ab0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61  >iDistinct = pPa
11ac0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
11ad0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
11af0 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
11b00 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
11b10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
11b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11b30 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70   /* Make pExpr p
11b40 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72  oint to the appr
11b50 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f  opriate pAggInfo
11b60 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a  ->aFunc[] entry.
11b70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11b80 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
11b90 20 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   i;.        pExp
11ba0 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41  r->pAggInfo = pA
11bb0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ggInfo;.        
11bc0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
11bd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
11be0 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 77 61  * Recursively wa
11bf0 6c 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f  lk subqueries lo
11c00 6f 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c  oking for TK_COL
11c10 55 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e  UMN nodes that n
11c20 65 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63  eed.  ** to be c
11c30 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47  hanged to TK_AGG
11c40 5f 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e  _COLUMN.  But in
11c50 63 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73  crement nDepth s
11c60 6f 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41  o that.  ** TK_A
11c70 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
11c80 73 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 20  s in subqueries 
11c90 77 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65  will be unchange
11ca0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  d..  */.  if( pE
11cb0 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
11cc0 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
11cd0 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63  +;.    walkSelec
11ce0 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65  tExpr(pExpr->pSe
11cf0 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67  lect, analyzeAgg
11d00 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
11d10 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b    pNC->nDepth--;
11d20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
11d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
11d40 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
11d50 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
11d60 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
11d70 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
11d80 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
11d90 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
11da0 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
11db0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
11dc0 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
11dd0 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
11de0 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
11df0 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
11e00 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
11e10 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
11e20 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
11e30 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
11e40 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
11e50 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
11e60 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
11e70 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72  s()..**.** If er
11e80 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c  rors are seen, l
11e90 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
11ea0 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67  ssage in zErrMsg
11eb0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74   and return.** t
11ec0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
11ed0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
11ee0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
11ef0 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
11f00 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
11f10 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e  *pExpr){.  int n
11f20 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  Err = pNC->pPars
11f30 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45  e->nErr;.  walkE
11f40 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61  xprTree(pExpr, a
11f50 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c  nalyzeAggregate,
11f60 20 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e 20   pNC);.  return 
11f70 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72  pNC->pParse->nEr
11f80 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  r - nErr;.}../*.
11f90 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45  ** Call sqlite3E
11fa0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
11fb0 61 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79  ates() for every
11fc0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
11fd0 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
11fe0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68  list.  Return th
11ff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
12000 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rs..**.** If an 
12010 65 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  error is found, 
12020 74 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20  the analysis is 
12030 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e  cut short..*/.in
12040 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
12050 6c 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65  lyzeAggList(Name
12060 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78  Context *pNC, Ex
12070 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
12080 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
12090 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
120a0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 45   int i;.  int nE
120b0 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c  rr = 0;.  if( pL
120c0 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ist ){.    for(p
120d0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
120e0 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
120f0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
12100 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
12110 20 20 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69      nErr += sqli
12120 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
12130 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49  gregates(pNC, pI
12140 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
12150 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12160 6e 45 72 72 3b 0a 7d 0a                          nErr;.}.