/ Hex Artifact Content
Login

Artifact 80ceb8c7d15dd53985831f0b4c660b3c3df796a3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 32 34 30 20 32 30 30 35 2f 31 31 2f 32 39 20  .240 2005/11/29 
0220: 30 33 3a 31 33 3a 32 32 20 64 72 68 20 45 78 70  03:13:22 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 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31  toi(&pToken->z[1
1d60: 5d 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20  ]);.  p->iTable 
1d70: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
1d80: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1d90: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
1da0: 64 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c  depth, 0);.  sql
1db0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1dc0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d   OP_MemStore, p-
1dd0: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72  >iTable, 1);.  r
1de0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1df0: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
1e00: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
1e10: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
1e20: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
1e30: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
1e40: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
1e50: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
1e60: 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ssion..*/.Expr *
1e70: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45  sqlite3ExprAnd(E
1e80: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
1e90: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
1ea0: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
1eb0: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
1ec0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
1ed0: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
1ee0: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
1ef0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  se{.    return s
1f00: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e  qlite3Expr(TK_AN
1f10: 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  D, pLeft, pRight
1f20: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
1f30: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
1f40: 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68  span field of th
1f50: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
1f60: 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a  on to span all.*
1f70: 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74  * text between t
1f80: 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b  he two given tok
1f90: 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ens..*/.void sql
1fa0: 69 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70  ite3ExprSpan(Exp
1fb0: 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20  r *pExpr, Token 
1fc0: 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pLeft, Token *p
1fd0: 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74  Right){.  assert
1fe0: 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ( pRight!=0 );. 
1ff0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
2000: 30 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  0 );.  if( !sqli
2010: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
2020: 64 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26  d && pRight->z &
2030: 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  & pLeft->z ){.  
2040: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
2050: 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74  >dyn==0 || pLeft
2060: 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30  ->z[pLeft->n]==0
2070: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66   );.    if( pLef
2080: 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69  t->dyn==0 && pRi
2090: 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20  ght->dyn==0 ){. 
20a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
20b0: 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20  .z = pLeft->z;. 
20c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
20d0: 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b  .n = pRight->n +
20e0: 20 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c   (pRight->z - pL
20f0: 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  eft->z);.    }el
2100: 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  se{.      pExpr-
2110: 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  >span.z = 0;.   
2120: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2130: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
2140: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
2150: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
2160: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
2170: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
2180: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
2190: 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74  unction(ExprList
21a0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
21b0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
21c0: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
21d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
21e0: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
21f0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
2200: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2210: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
2220: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
2230: 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61  g memory when ma
2240: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
2250: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2260: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
2270: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77  FUNCTION;.  pNew
2280: 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  ->pList = pList;
2290: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
22a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
22b0: 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20  ken->dyn==0 );. 
22c0: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d     pNew->token =
22d0: 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73   *pToken;.  }els
22e0: 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  e{.    pNew->tok
22f0: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  en.z = 0;.  }.  
2300: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
2310: 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75  w->token;.  retu
2320: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
2330: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
2340: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
2350: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
2360: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
2370: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
2380: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
2390: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
23a0: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
23b0: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
23c0: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
23d0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
23e0: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
23f0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
2400: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
2410: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
2420: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
2430: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
2440: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
2450: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74   is not too be t
2460: 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c  o avoid a denial
2470: 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61   of service atta
2480: 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53  ck when.** the S
2490: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  QL statement com
24a0: 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72  es from an exter
24b0: 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a  nal source..**.*
24c0: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
24d0: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f  he form ":aaa" o
24e0: 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73  r "$aaa" are ass
24f0: 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e  igned the same n
2500: 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20  umber.** as the 
2510: 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63  previous instanc
2520: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69  e of the same wi
2530: 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74  ldcard.  Or if t
2540: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
2550: 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  .** instance of 
2560: 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68  the wildcard, th
2570: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c  e next sequenial
2580: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2590: 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e   is.** assigned.
25a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25b0: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
25c0: 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ber(Parse *pPars
25d0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
25e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  .  Token *pToken
25f0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
2600: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f   ) return;.  pTo
2610: 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f  ken = &pExpr->to
2620: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ken;.  assert( p
2630: 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20  Token->n>=1 );. 
2640: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2650: 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  >z!=0 );.  asser
2660: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21  t( pToken->z[0]!
2670: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b  =0 );.  if( pTok
2680: 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  en->n==1 ){.    
2690: 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74  /* Wildcard of t
26a0: 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73  he form "?".  As
26b0: 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61  sign the next va
26c0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
26d0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
26e0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
26f0: 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Var;.  }else if(
2700: 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27   pToken->z[0]=='
2710: 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  ?' ){.    /* Wil
2720: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2730: 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65  m "?nnn".  Conve
2740: 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69  rt "nnn" to an i
2750: 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a  nteger and.    *
2760: 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  * use it as the 
2770: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2780: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  */.    int i;.  
2790: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
27a0: 3d 20 69 20 3d 20 61 74 6f 69 28 26 70 54 6f 6b  = i = atoi(&pTok
27b0: 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 69  en->z[1]);.    i
27c0: 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c 49  f( i<1 || i>SQLI
27d0: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
27e0: 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20 20  NUMBER ){.      
27f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2800: 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c  pParse, "variabl
2810: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65  e number must be
2820: 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20   between ?1 and 
2830: 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?%d",.          
2840: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
2850: 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 20  BLE_NUMBER);.   
2860: 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61   }.    if( i>pPa
2870: 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20  rse->nVar ){.   
2880: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
2890: 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = i;.    }.  }el
28a0: 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63  se{.    /* Wildc
28b0: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
28c0: 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61   ":aaa" or "$aaa
28d0: 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61  ".  Reuse the sa
28e0: 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  me variable.    
28f0: 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ** number as the
2900: 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63   prior appearanc
2910: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
2920: 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61  me, or if the na
2930: 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  me.    ** has ne
2940: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
2950: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
2960: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
2970: 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ber.    */.    i
2980: 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d  nt i, n;.    n =
2990: 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20   pToken->n;.    
29a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
29b0: 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b  e->nVarExpr; i++
29c0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
29d0: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45  E;.      if( (pE
29e0: 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72   = pParse->apVar
29f0: 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20  Expr[i])!=0.    
2a00: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b        && pE->tok
2a10: 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20  en.n==n.        
2a20: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e    && memcmp(pE->
2a30: 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d  token.z, pToken-
2a40: 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  >z, n)==0 ){.   
2a50: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2a60: 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b  le = pE->iTable;
2a70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a90: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
2aa0: 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20  >nVarExpr ){.   
2ab0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
2ac0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61   = ++pParse->nVa
2ad0: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  r;.      if( pPa
2ae0: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70  rse->nVarExpr>=p
2af0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
2b00: 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  lloc-1 ){.      
2b10: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78    pParse->nVarEx
2b20: 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73  prAlloc += pPars
2b30: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
2b40: 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 73   + 10;.        s
2b50: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46  qlite3ReallocOrF
2b60: 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 50 61  ree((void**)&pPa
2b70: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a  rse->apVarExpr,.
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
2ba0: 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a  VarExprAlloc*siz
2bb0: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61  eof(pParse->apVa
2bc0: 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20 20  rExpr[0]) );.   
2bd0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2be0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
2bf0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
2c00: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
2c10: 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b  >apVarExpr!=0 );
2c20: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
2c30: 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72 73  >apVarExpr[pPars
2c40: 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d  e->nVarExpr++] =
2c50: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a   pExpr;.      }.
2c60: 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a      }.  } .}../*
2c70: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
2c80: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
2c90: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f  sion tree..*/.vo
2ca0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  id sqlite3ExprDe
2cb0: 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  lete(Expr *p){. 
2cc0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2cd0: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61  rn;.  if( p->spa
2ce0: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72  n.dyn ) sqliteFr
2cf0: 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61  ee((char*)p->spa
2d00: 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74  n.z);.  if( p->t
2d10: 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  oken.dyn ) sqlit
2d20: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  eFree((char*)p->
2d30: 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69  token.z);.  sqli
2d40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
2d50: 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74  >pLeft);.  sqlit
2d60: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
2d70: 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74  pRight);.  sqlit
2d80: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2d90: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71  (p->pList);.  sq
2da0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2db0: 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  e(p->pSelect);. 
2dc0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
2dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70  }../*.** The Exp
2de0: 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69  r.token field mi
2df0: 67 68 74 20 62 65 20 61 20 73 74 72 69 6e 67 20  ght be a string 
2e00: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 69 73 20  literal that is 
2e10: 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f  quoted..** If so
2e20: 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f  , remove the quo
2e30: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f  tation marks..*/
2e40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71  .void sqlite3Deq
2e50: 75 6f 74 65 45 78 70 72 28 45 78 70 72 20 2a 70  uoteExpr(Expr *p
2e60: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
2e70: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45  AnyProperty(p, E
2e80: 50 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20  P_Dequoted) ){. 
2e90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2ea0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2eb0: 28 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29  (p, EP_Dequoted)
2ec0: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
2ed0: 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73  .dyn==0 ){.    s
2ee0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
2ef0: 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74  &p->token, &p->t
2f00: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  oken);.  }.  sql
2f10: 69 74 65 33 44 65 71 75 6f 74 65 28 28 63 68 61  ite3Dequote((cha
2f20: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  r*)p->token.z);.
2f30: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  }.../*.** The fo
2f40: 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66  llowing group of
2f50: 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64   routines make d
2f60: 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78  eep copies of ex
2f70: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78  pressions,.** ex
2f80: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20  pression lists, 
2f90: 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65  ID lists, and se
2fa0: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e  lect statements.
2fb0: 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e    The copies can
2fc0: 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28  .** be deleted (
2fd0: 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20  by being passed 
2fe0: 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74  to their respect
2ff0: 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20  ive ...Delete() 
3000: 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74  routines).** wit
3010: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
3020: 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a  he originals..**
3030: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
3040: 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64  on list, ID, and
3050: 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65   source lists re
3060: 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45  turn by sqlite3E
3070: 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a  xprListDup(),.**
3080: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
3090: 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33  p(), and sqlite3
30a0: 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e  SrcListDup() can
30b0: 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20   not be further 
30c0: 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20  expanded .** by 
30d0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
30e0: 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41   to sqlite*ListA
30f0: 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73  ppend() routines
3100: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c  ..**.** Any tabl
3110: 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c  es that the SrcL
3120: 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ist might point 
3130: 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69  to are not dupli
3140: 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  cated..*/.Expr *
3150: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 45  sqlite3ExprDup(E
3160: 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  xpr *p){.  Expr 
3170: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
3180: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3190: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
31a0: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
31b0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
31c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
31d0: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70    memcpy(pNew, p
31e0: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
31f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
3200: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  .z!=0 ){.    pNe
3210: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 73 71 6c  w->token.z = sql
3220: 69 74 65 53 74 72 4e 44 75 70 28 70 2d 3e 74 6f  iteStrNDup(p->to
3230: 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e  ken.z, p->token.
3240: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f  n);.    pNew->to
3250: 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d  ken.dyn = 1;.  }
3260: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
3270: 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d  ( pNew->token.z=
3280: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  =0 );.  }.  pNew
3290: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20  ->span.z = 0;.  
32a0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
32b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
32c0: 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pLeft);.  pNew->
32d0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
32e0: 45 78 70 72 44 75 70 28 70 2d 3e 70 52 69 67 68  ExprDup(p->pRigh
32f0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  t);.  pNew->pLis
3300: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
3310: 69 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74 29  istDup(p->pList)
3320: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63  ;.  pNew->pSelec
3330: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
3340: 74 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29  tDup(p->pSelect)
3350: 3b 0a 20 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d  ;.  pNew->pTab =
3360: 20 70 2d 3e 70 54 61 62 3b 0a 20 20 72 65 74 75   p->pTab;.  retu
3370: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20  rn pNew;.}.void 
3380: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
3390: 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b  (Token *pTo, Tok
33a0: 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  en *pFrom){.  if
33b0: 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c  ( pTo->dyn ) sql
33c0: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
33d0: 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46  To->z);.  if( pF
33e0: 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54  rom->z ){.    pT
33f0: 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b  o->n = pFrom->n;
3400: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73 71  .    pTo->z = sq
3410: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46 72 6f  liteStrNDup(pFro
3420: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
3430: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
3440: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
3450: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
3460: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
3470: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45  te3ExprListDup(E
3480: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
3490: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
34a0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
34b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
34c0: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
34d0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
34e0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
34f0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3500: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
3510: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3520: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3530: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
3540: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
3550: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
3560: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61  pItem = sqliteMa
3570: 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73  lloc( p->nExpr*s
3580: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
3590: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
35a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
35b0: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
35c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
35d0: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
35e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
35f0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
3600: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
3610: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
3620: 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b  Expr, *pOldExpr;
3630: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
3640: 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73  r = pNewExpr = s
3650: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
3660: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
3670: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
3680: 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  f( pOldExpr->spa
3690: 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78  n.z!=0 && pNewEx
36a0: 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  pr ){.      /* A
36b0: 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70  lways make a cop
36c0: 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f  y of the span fo
36d0: 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72  r top-level expr
36e0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
36f0: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
3700: 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f  on list.  The lo
3710: 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72  gic in SELECT pr
3720: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65  ocessing that de
3730: 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a  termines.      *
3740: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  * the names of c
3750: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
3760: 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74  sult set needs t
3770: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
3780: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3790: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45  TokenCopy(&pNewE
37a0: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64  xpr->span, &pOld
37b0: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
37c0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
37d0: 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e  NewExpr==0 || pN
37e0: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ewExpr->span.z!=
37f0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  0 .            |
3800: 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  | pOldExpr->span
3810: 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  .z==0 || sqlite3
3820: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
3830: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
3840: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
3850: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
3860: 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73  e);.    pItem->s
3870: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49  ortOrder = pOldI
3880: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
3890: 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67      pItem->isAgg
38a0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41   = pOldItem->isA
38b0: 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  gg;.    pItem->d
38c0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  one = 0;.  }.  r
38d0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
38e0: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
38f0: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
3900: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
3910: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
3920: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
3930: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
3940: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
3950: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
3960: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
3970: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
3980: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
3990: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
39a0: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
39b0: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
39c0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
39d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
39e0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
39f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3a00: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
3a10: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
3a20: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
3a30: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
3a40: 65 33 53 72 63 4c 69 73 74 44 75 70 28 53 72 63  e3SrcListDup(Src
3a50: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  List *p){.  SrcL
3a60: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
3a70: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   i;.  int nByte;
3a80: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
3a90: 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20  turn 0;.  nByte 
3aa0: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28  = sizeof(*p) + (
3ab0: 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65  p->nSrc>0 ? size
3ac0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
3ad0: 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a  ->nSrc-1) : 0);.
3ae0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
3af0: 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20  allocRaw( nByte 
3b00: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
3b10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3b20: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
3b30: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
3b40: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
3b50: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
3b60: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
3b70: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
3b80: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
3b90: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
3ba0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
3bb0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
3bc0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
3bd0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
3be0: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
3bf0: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
3c00: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
3c10: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
3c20: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
3c30: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
3c40: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3c50: 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 53  zAlias = sqliteS
3c60: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
3c70: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
3c80: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
3c90: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
3ca0: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
3cb0: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
3cc0: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
3cd0: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
3ce0: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
3cf0: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
3d00: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
3d10: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
3d20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
3d30: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
3d40: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
3d50: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
3d60: 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  t);.    pNewItem
3d70: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
3d80: 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  xprDup(pOldItem-
3d90: 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49  >pOn);.    pNewI
3da0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
3db0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70  lite3IdListDup(p
3dc0: 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  OldItem->pUsing)
3dd0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3de0: 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74  colUsed = pOldIt
3df0: 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d  em->colUsed;.  }
3e00: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3e10: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
3e20: 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73  3IdListDup(IdLis
3e30: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
3e40: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
3e50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3e60: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3e70: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3e80: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
3e90: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3ea0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3eb0: 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e  ew->nId = pNew->
3ec0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b  nAlloc = p->nId;
3ed0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
3ee0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d  iteMallocRaw( p-
3ef0: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
3f00: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
3f10: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
3f20: 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29  sqliteFree(pNew)
3f30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
3f40: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
3f50: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
3f60: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3f70: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
3f80: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
3f90: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3fa0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
3fb0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
3fc0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
3fd0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3fe0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
3ff0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
4000: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
4010: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
4020: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
4030: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4040: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
4050: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
4060: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
4070: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
4080: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
4090: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
40a0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
40b0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
40c0: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
40d0: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
40e0: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
40f0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
4100: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
4110: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
4120: 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70  3SrcListDup(p->p
4130: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
4140: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
4150: 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29  prDup(p->pWhere)
4160: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
4170: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
4180: 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75  ListDup(p->pGrou
4190: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
41a0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
41b0: 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e  xprDup(p->pHavin
41c0: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
41d0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
41e0: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72  prListDup(p->pOr
41f0: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
4200: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
4210: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
4220: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
4230: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77  >pPrior);.  pNew
4240: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
4250: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69  e3ExprDup(p->pLi
4260: 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  mit);.  pNew->pO
4270: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
4280: 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65  xprDup(p->pOffse
4290: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
42a0: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
42b0: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
42c0: 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65   pNew->isResolve
42d0: 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  d = p->isResolve
42e0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  d;.  pNew->isAgg
42f0: 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70   = p->isAgg;.  p
4300: 4e 65 77 2d 3e 75 73 65 73 56 69 72 74 20 3d 20  New->usesVirt = 
4310: 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c  0;.  pNew->disal
4320: 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  lowOrderBy = 0;.
4330: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
4340: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
4350: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
4360: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
4370: 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d 20  drOpenVirt[1] = 
4380: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
4390: 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 2d 31  OpenVirt[2] = -1
43a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
43b0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
43c0: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
43d0: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
43e0: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
43f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4400: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
4410: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
4420: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
4430: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4440: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
4450: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
4460: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
4470: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
4480: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
4490: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
44a0: 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20  Append(ExprList 
44b0: 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45  *pList, Expr *pE
44c0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  xpr, Token *pNam
44d0: 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  e){.  if( pList=
44e0: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
44f0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4500: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
4510: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
4520: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
4530: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
4540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
4550: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b  st->nAlloc==0 );
4560: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
4570: 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d  ->nAlloc<=pList-
4580: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74  >nExpr ){.    st
4590: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
45a0: 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e  em *a;.    int n
45b0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
45c0: 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20  *2 + 4;.    a = 
45d0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
45e0: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
45f0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
4600: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
4610: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
4620: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
4630: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70  st->a = a;.    p
4640: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e  List->nAlloc = n
4650: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4660: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
4670: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
4680: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
4690: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
46a0: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
46b0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
46c0: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
46d0: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
46e0: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
46f0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
4700: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4710: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  n(pName);.    pI
4720: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
4730: 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pr;.  }.  return
4740: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
4750: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
4760: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
4770: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
4780: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
4790: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
47a0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
47b0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
47c0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
47d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
47e0: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
47f0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
4800: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
4810: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
4820: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
4830: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
4840: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
4850: 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
4860: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
4870: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
4880: 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45  =0 || (pList->nE
4890: 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d  xpr==0 && pList-
48a0: 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20  >nAlloc==0) );. 
48b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
48c0: 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41  nExpr<=pList->nA
48d0: 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49  lloc );.  for(pI
48e0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
48f0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
4900: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
4910: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4920: 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
4930: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
4940: 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  eFree(pItem->zNa
4950: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
4960: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
4970: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
4980: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ist);.}../*.** W
4990: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
49a0: 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46  n tree.  Call xF
49b0: 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64  unc for each nod
49c0: 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  e visited..**.**
49d0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
49e0: 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74  e from xFunc det
49f0: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
4a00: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
4a10: 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65  ntinues..** 0 me
4a20: 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c  ans continue wal
4a30: 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20  king the tree.  
4a40: 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77  1 means do not w
4a50: 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20  alk children.** 
4a60: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  of the current n
4a70: 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  ode but continue
4a80: 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20   with siblings. 
4a90: 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e   2 means abandon
4aa0: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c  .** the tree wal
4ab0: 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a  k completely..**
4ac0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
4ad0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72  alue from this r
4ae0: 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61  outine is 1 to a
4af0: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
4b00: 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f  walk.** and 0 to
4b10: 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
4b20: 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72   NOTICE:  This r
4b30: 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74  outine does *not
4b40: 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73  * descend into s
4b50: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  ubqueries..*/.st
4b60: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
4b70: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
4b80: 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a  , int (*)(void *
4b90: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
4ba0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  );.static int wa
4bb0: 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20  lkExprTree(Expr 
4bc0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46  *pExpr, int (*xF
4bd0: 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a  unc)(void*,Expr*
4be0: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
4bf0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
4c00: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4c10: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46  n 0;.  rc = (*xF
4c20: 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72  unc)(pArg, pExpr
4c30: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
4c40: 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  {.    if( walkEx
4c50: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c  prTree(pExpr->pL
4c60: 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  eft, xFunc, pArg
4c70: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
4c80: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
4c90: 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ee(pExpr->pRight
4ca0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
4cb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
4cc0: 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  f( walkExprList(
4cd0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46  pExpr->pList, xF
4ce0: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4cf0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
4d00: 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  urn rc>1;.}../*.
4d10: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
4d20: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
4d30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c   expression in l
4d40: 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist p..*/.static
4d50: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
4d60: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
4d70: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
4d80: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
4d90: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69   *pArg){.  int i
4da0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
4db0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
4dc0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
4dd0: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  rn 0;.  for(i=p-
4de0: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
4df0: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
4e00: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
4e10: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74  walkExprTree(pIt
4e20: 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63  em->pExpr, xFunc
4e30: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
4e40: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4e50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c   0;.}../*.** Cal
4e60: 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  l walkExprTree()
4e70: 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
4e80: 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20  ssion in Select 
4e90: 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  p, not including
4ea0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
4eb0: 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66  that are part of
4ec0: 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20   sub-selects in 
4ed0: 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  any FROM clause 
4ee0: 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20  or the LIMIT.** 
4ef0: 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73  or OFFSET expres
4f00: 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69  sions...*/.stati
4f10: 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74  c int walkSelect
4f20: 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20  Expr(Select *p, 
4f30: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
4f40: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
4f50: 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b  d *pArg){.  walk
4f60: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
4f70: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
4f80: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
4f90: 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e  (p->pWhere, xFun
4fa0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
4fb0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
4fc0: 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  upBy, xFunc, pAr
4fd0: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
4fe0: 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78  ee(p->pHaving, x
4ff0: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
5000: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
5010: 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20  OrderBy, xFunc, 
5020: 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  pArg);.  return 
5030: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0;.}.../*.** Thi
5040: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
5050: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
5060: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
5070: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67  ee()..**.** pArg
5080: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
5090: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
50a0: 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74  er.  If we can t
50b0: 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a  ell by looking.*
50c0: 2a 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20  * at pExpr that 
50d0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
50e0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78  hat contains pEx
50f0: 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  pr is not a cons
5100: 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69  tant.** expressi
5110: 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41  on, then set *pA
5120: 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  rg to 0 and retu
5130: 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20  rn 2 to abandon 
5140: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
5150: 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20  * If pExpr does 
5160: 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c  does not disqual
5170: 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
5180: 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20  on from being a 
5190: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e  constant.** then
51a0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   do nothing..**.
51b0: 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67  ** After walking
51c0: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c   the whole tree,
51d0: 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65   if no nodes are
51e0: 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71   found that disq
51f0: 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78  ualify.** the ex
5200: 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73  pression as cons
5210: 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73  tant, then we as
5220: 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65  sume the whole e
5230: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
5240: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73  constant.  See s
5250: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
5260: 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74  tant() for addit
5270: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
5280: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
5290: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
52a0: 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ant(void *pArg, 
52b0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
52c0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
52d0: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  p ){.    /* Cons
52e0: 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ider functions t
52f0: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66  o be constant if
5300: 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d   all their argum
5310: 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  ents are constan
5320: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41  t.    ** and *pA
5330: 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73  rg==2 */.    cas
5340: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
5350: 20 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74 2a       if( *((int*
5360: 29 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74 75  )pArg)==2 ) retu
5370: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
5380: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
5390: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
53a0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
53b0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
53c0: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
53d0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
53e0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
53f0: 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51  LUMN:.#ifndef SQ
5400: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5410: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
5420: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
5430: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
5440: 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29  f.      *((int*)
5450: 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20  pArg) = 0;.     
5460: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63   return 2;.    c
5470: 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20  ase TK_IN:.     
5480: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
5490: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ect ){.        *
54a0: 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30  ((int*)pArg) = 0
54b0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
54c0: 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   2;.      }.    
54d0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
54e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
54f0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
5500: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5510: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
5520: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
5530: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
5540: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
5550: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
5560: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
5570: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
5580: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
5590: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
55a0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
55b0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
55c0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
55d0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
55e0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
55f0: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
5600: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
5610: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
5620: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
5630: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5640: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
5650: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
5660: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
5670: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
5680: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
5690: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
56a0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
56b0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
56c0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
56d0: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
56e0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
56f0: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
5700: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
5710: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
5720: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
5730: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
5740: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
5750: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
5760: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
5770: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
5780: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
5790: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
57a0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
57b0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
57c0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
57d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
57e0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
57f0: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
5800: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
5810: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
5820: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
5830: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
5840: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
5850: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
5860: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
5870: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
5880: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
5890: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
58a0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
58b0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
58c0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
58d0: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
58e0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
58f0: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
5900: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5910: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
5920: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
5930: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
5940: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
5950: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
5960: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
5970: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
5980: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5990: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
59a0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
59b0: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
59c0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
59d0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
59e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
59f0: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b  3GetInt32(p->tok
5a00: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b  en.z, pValue) ){
5a10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5a20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5a30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5a40: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
5a50: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
5a60: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
5a70: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
5a80: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Value);.    }.  
5a90: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
5aa0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
5ab0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
5ac0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
5ad0: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
5ae0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
5af0: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
5b00: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5b10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5b20: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5b30: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
5b40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5b50: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5b60: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
5b70: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
5b80: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
5b90: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
5ba0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
5bb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5bc0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
5bd0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
5be0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
5bf0: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
5c00: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
5c10: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
5c20: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
5c30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
5c40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5c50: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
5c60: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
5c70: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
5c80: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
5c90: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
5ca0: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
5cb0: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
5cc0: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
5cd0: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
5ce0: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
5cf0: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
5d00: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
5d10: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
5d20: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
5d30: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
5d40: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
5d50: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
5d60: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
5d70: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
5d80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5d90: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  holding.**      
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a     the table..**
5dc0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
5dd0: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
5de0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
5df0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5e00: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e20: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
5e30: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
5e40: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
5e50: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
5e60: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
5e70: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
5e80: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
5e90: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
5ea0: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
5eb0: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
5ec0: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
5ed0: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
5ee0: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
5ef0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
5f00: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
5f10: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
5f20: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
5f30: 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65  *.** The pDbToke
5f40: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
5f50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
5f60: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
5f70: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
5f80: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
5f90: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
5fa0: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
5fb0: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
5fc0: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
5fd0: 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62   used.  The pTab
5fe0: 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  leToken is the n
5ff0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6000: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
6010: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
6020: 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b  e NULL if pDbTok
6030: 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  en is also NULL.
6040: 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e    If pTableToken
6050: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
6060: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
6070: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
6080: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
6090: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
60a0: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
60b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
60c0: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
60d0: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
60e0: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
60f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
6100: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
6110: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
6120: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e    Return zero on
6130: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
6140: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
6150: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
6160: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
6170: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
6180: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  t */.  Token *pD
6190: 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e  bToken,     /* N
61a0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
61b0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
61c0: 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  able, or NULL */
61d0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
61e0: 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20  Token,  /* Name 
61f0: 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  of table contain
6200: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e  ing column, or N
6210: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
6220: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a  pColumnToken, /*
6230: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
6240: 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  umn. */.  NameCo
6250: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f  ntext *pNC,    /
6260: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
6270: 78 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  xt used to resol
6280: 76 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  ve the name */. 
6290: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
62a0: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68        /* Make th
62b0: 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69  is EXPR node poi
62c0: 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74  nt to the select
62d0: 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ed column */.){.
62e0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
62f0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
6300: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
6310: 20 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e   The "X" in X.Y.
6320: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  Z */.  char *zTa
6330: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
6340: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6350: 2e 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e  .  The "Y" in X.
6360: 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20  Y.Z or Y.Z */.  
6370: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20  char *zCol = 0; 
6380: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
6390: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  the column.  The
63a0: 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c   "Z" */.  int i,
63b0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
63c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
63d0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
63e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
63f0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
6400: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
6410: 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30    int cntTab = 0
6420: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
6430: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62   of matching tab
6440: 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71  le names */.  sq
6450: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6460: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
6470: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74  database */.  st
6480: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
6490: 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20  m *pItem;       
64a0: 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69  /* Use for loopi
64b0: 6e 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  ng over pSrcList
64c0: 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75   items */.  stru
64d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
64e0: 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a  *pMatch = 0;  /*
64f0: 20 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53   The matching pS
6500: 72 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20  rcList item */. 
6510: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54   NameContext *pT
6520: 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20  opNC = pNC;     
6530: 20 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65     /* First name
6540: 63 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c  context in the l
6550: 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
6560: 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26  ( pColumnToken &
6570: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
6580: 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e  z ); /* The Z in
6590: 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65   X.Y.Z cannot be
65a0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d   NULL */.  zDb =
65b0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
65c0: 54 6f 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b  Token(pDbToken);
65d0: 0a 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65  .  zTab = sqlite
65e0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
65f0: 54 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a  TableToken);.  z
6600: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Col = sqlite3Nam
6610: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75  eFromToken(pColu
6620: 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20  mnToken);.  if( 
6630: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
6640: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
6650: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
6660: 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e  ;.  }..  pExpr->
6670: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77  iTable = -1;.  w
6680: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74  hile( pNC && cnt
6690: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  ==0 ){.    ExprL
66a0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
66b0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
66c0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
66d0: 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72  st;..    if( pSr
66e0: 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  cList ){.      f
66f0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53  or(i=0, pItem=pS
6700: 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72  rcList->a; i<pSr
6710: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
6720: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
6730: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
6740: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
6750: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
6760: 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Col;.  .        
6770: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f  if( pTab==0 ) co
6780: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6790: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
67a0: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
67b0: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
67c0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
67d0: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
67e0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
67f0: 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  bName = pItem->z
6800: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
6810: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6820: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
6830: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
6840: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
6850: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6860: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
6870: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
6880: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6890: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  zTabName==0 || s
68a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
68b0: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
68c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
68d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62           if( zDb
68e0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
68f0: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 70 54  rICmp(db->aDb[pT
6900: 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  ab->iDb].zName, 
6910: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
6920: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
6930: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
6940: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6960: 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29  f( 0==(cntTab++)
6970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
6980: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
6990: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
69a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
69b0: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
69c0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
69d0: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
69e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
69f0: 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  j=0, pCol=pTab->
6a00: 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
6a10: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; j++, pCol++)
6a20: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
6a30: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
6a40: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
6a50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6a60: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69      IdList *pUsi
6a70: 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng;.            
6a80: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
6a90: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6aa0: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
6ab0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
6ac0: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
6ad0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6ae0: 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44  ->iDb = pTab->iD
6af0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;.            /
6b00: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
6b10: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
6b20: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
6b30: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
6b40: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
6b50: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
6b60: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
6b70: 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20  -1 : j;.        
6b80: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
6b90: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
6ba0: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
6bb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6bc0: 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  >pColl = pTab->a
6bd0: 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20  Col[j].pColl;.  
6be0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
6bf0: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
6c00: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6c20: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
6c30: 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66  urred in the lef
6c40: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74  t table of a nat
6c50: 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20  ural join,.     
6c60: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e           ** then
6c70: 20 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20   skip the right 
6c80: 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61  table to avoid a
6c90: 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68   duplicate match
6ca0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6cb0: 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20    pItem++;.     
6cc0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
6cd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6ce0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55 73          if( (pUs
6cf0: 69 6e 67 20 3d 20 70 49 74 65 6d 2d 3e 70 55 73  ing = pItem->pUs
6d00: 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ing)!=0 ){.     
6d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
6d20: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73  his match occurs
6d30: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61   on a column tha
6d40: 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e  t is in the USIN
6d50: 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  G clause.       
6d60: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a         ** of a j
6d70: 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65  oin, skip the se
6d80: 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68  arch of the righ
6d90: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
6da0: 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  oin.            
6db0: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20    ** to avoid a 
6dc0: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
6dd0: 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20  there. */.      
6de0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
6e00: 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e  (k=0; k<pUsing->
6e10: 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  nId; k++){.     
6e20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
6e30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55  qlite3StrICmp(pU
6e40: 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65  sing->a[k].zName
6e50: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
6e80: 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6eb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6ec0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6ed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6f00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6f10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6f20: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
6f30: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e   /* If we have n
6f40: 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c  ot already resol
6f50: 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68  ved the name, th
6f60: 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a  en maybe .    **
6f70: 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f   it is a new.* o
6f80: 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20  r old.* trigger 
6f90: 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e  argument referen
6fa0: 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ce.    */.    if
6fb0: 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62  ( zDb==0 && zTab
6fc0: 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26  !=0 && cnt==0 &&
6fd0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
6fe0: 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ck!=0 ){.      T
6ff0: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72  riggerStack *pTr
7000: 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61  iggerStack = pPa
7010: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
7020: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7030: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
7040: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
7050: 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20  newIdx != -1 && 
7060: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
7070: 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30  new", zTab) == 0
7080: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
7090: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
70a0: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
70b0: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
70c0: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
70d0: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
70e0: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
70f0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
7100: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
7110: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
7120: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
7130: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64  ite3StrICmp("old
7140: 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20  ", zTab)==0 ){. 
7150: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
7160: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
7170: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20  tack->oldIdx;.  
7180: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
7190: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
71a0: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  b );.        pTa
71b0: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
71c0: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d  k->pTab;.      }
71d0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
71e0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74   ){ .        int
71f0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75   j;.        Colu
7200: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d  mn *pCol = pTab-
7210: 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  >aCol;..        
7220: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
7230: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20  b->iDb;.        
7240: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
7250: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70    for(j=0; j < p
7260: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
7270: 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20  pCol++) {.      
7280: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
7290: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
72a0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b              cnt+
72c0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
72d0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
72e0: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f  j==pTab->iPKey ?
72f0: 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20   -1 : j;.       
7300: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
7310: 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f  nity = pTab->aCo
7320: 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  l[j].affinity;. 
7330: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7340: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e  ->pColl = pTab->
7350: 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20  aCol[j].pColl;. 
7360: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7370: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
7380: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7390: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
73a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
73b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
73c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
73d0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
73e0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
73f0: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
7400: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
7410: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20  to the ROWID.   
7420: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
7430: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
7440: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
7450: 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  d(zCol) ){.     
7460: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
7470: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
7480: 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72   -1;.      pExpr
7490: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
74a0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
74b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
74c0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70     ** If the inp
74d0: 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ut is of the for
74e0: 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20  m Z (not Y.Z or 
74f0: 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20  X.Y.Z) then the 
7500: 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69  name Z.    ** mi
7510: 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20  ght refer to an 
7520: 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73  result-set alias
7530: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
7540: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
7550: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65  en.    ** we are
7560: 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73   resolving names
7570: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
7580: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ause of the foll
7590: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20  owing command:. 
75a0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
75b0: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
75c0: 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52   FROM table WHER
75d0: 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20  E x<10;.    **. 
75e0: 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c     ** In cases l
75f0: 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63  ike this, replac
7600: 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63  e pExpr with a c
7610: 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
7620: 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a  ssion that.    *
7630: 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75  * forms the resu
7640: 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61  lt set entry ("a
7650: 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  +b" in the examp
7660: 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69  le) and return i
7670: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
7680: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
7690: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
76a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68  he result set sh
76b0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
76c0: 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65  y been.    ** re
76d0: 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69  solved by the ti
76e0: 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  me the WHERE cla
76f0: 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e  use is resolved.
7700: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7710: 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73  cnt==0 && (pELis
7720: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
7730: 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29  !=0 && zTab==0 )
7740: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
7750: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
7760: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7770: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
7780: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
7790: 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21          if( zAs!
77a0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
77b0: 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d  ICmp(zAs, zCol)=
77c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
77d0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
77e0: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
77f0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
7800: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7810: 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20  op = TK_AS;.    
7820: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
7830: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
7840: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
7850: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7860: 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  p(pEList->a[j].p
7870: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
7880: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
7890: 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62      assert( zTab
78a0: 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b  ==0 && zDb==0 );
78b0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
78c0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32  lookupname_end_2
78d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
78e0: 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20    } .    }..    
78f0: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
7900: 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74  e next name cont
7910: 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77  ext.  The loop w
7920: 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69  ill exit when ei
7930: 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68  ther.    ** we h
7940: 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74  ave a match (cnt
7950: 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72  >0) or when we r
7960: 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63  un out of name c
7970: 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a  ontexts..    */.
7980: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29      if( cnt==0 )
7990: 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e  {.      pNC = pN
79a0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  C->pNext;.    }.
79b0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
79c0: 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55  f X and Y are NU
79d0: 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  LL (in other wor
79e0: 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63  ds if only the c
79f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a  olumn name Z is.
7a00: 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61    ** supplied) a
7a10: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
7a20: 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  Z is enclosed in
7a30: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20   double-quotes, 
7a40: 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61  then.  ** Z is a
7a50: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
7a60: 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61  if it doesn't ma
7a70: 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e  tch any column n
7a80: 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20  ames.  In that. 
7a90: 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65   ** case, we nee
7aa0: 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68  d to return righ
7ab0: 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d  t away and not m
7ac0: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ake any changes 
7ad0: 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20  to.  ** pExpr.. 
7ae0: 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65   **.  ** Because
7af0: 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
7b00: 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20  s made to outer 
7b10: 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e  contexts, the pN
7b20: 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65  C->nRef.  ** fie
7b30: 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e  lds are not chan
7b40: 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65  ged in any conte
7b50: 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  xt..  */.  if( c
7b60: 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  nt==0 && zTab==0
7b70: 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e   && pColumnToken
7b80: 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20  ->z[0]=='"' ){. 
7b90: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43     sqliteFree(zC
7ba0: 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ol);.    return 
7bb0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  0;.  }..  /*.  *
7bc0: 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74  * cnt==0 means t
7bd0: 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74  here was not mat
7be0: 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73  ch.  cnt>1 means
7bf0: 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20   there were two 
7c00: 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74  or.  ** more mat
7c10: 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61  ches.  Either wa
7c20: 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72  y, we have an er
7c30: 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ror..  */.  if( 
7c40: 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68  cnt!=1 ){.    ch
7c50: 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63  ar *z = 0;.    c
7c60: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a  har *zErr;.    z
7c70: 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22  Err = cnt==0 ? "
7c80: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
7c90: 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73  %s" : "ambiguous
7ca0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
7cb0: 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29  ";.    if( zDb )
7cc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
7cd0: 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62  etString(&z, zDb
7ce0: 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22  , ".", zTab, "."
7cf0: 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , zCol, 0);.    
7d00: 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29  }else if( zTab )
7d10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
7d20: 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54 61  etString(&z, zTa
7d30: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29  b, ".", zCol, 0)
7d40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7d50: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72     z = sqliteStr
7d60: 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  Dup(zCol);.    }
7d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7d80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72  rMsg(pParse, zEr
7d90: 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, z);.    sqlit
7da0: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54  eFree(z);.    pT
7db0: 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  opNC->nErr++;.  
7dc0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c  }..  /* If a col
7dd0: 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  umn from a table
7de0: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20   in pSrcList is 
7df0: 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e  referenced, then
7e00: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69   record.  ** thi
7e10: 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53  s fact in the pS
7e20: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
7e30: 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c  ed bitmask.  Col
7e40: 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a  umn 0 causes.  *
7e50: 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65  * bit 0 to be se
7e60: 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74  t.  Column 1 set
7e70: 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f  s bit 1.  And so
7e80: 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a   forth.  If the.
7e90: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    ** column numb
7ea0: 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
7eb0: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  an the number of
7ec0: 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74   bits in the bit
7ed0: 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73  mask.  ** then s
7ee0: 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65  et the high-orde
7ef0: 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74  r bit of the bit
7f00: 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mask..  */.  if(
7f10: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
7f20: 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20  =0 && pMatch!=0 
7f30: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
7f40: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
7f50: 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66     if( n>=sizeof
7f60: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20  (Bitmask)*8 ){. 
7f70: 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28       n = sizeof(
7f80: 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20  Bitmask)*8-1;.  
7f90: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
7fa0: 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d  pMatch->iCursor=
7fb0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
7fc0: 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f  ;.    pMatch->co
7fd0: 6c 55 73 65 64 20 7c 3d 20 31 3c 3c 6e 3b 0a 20  lUsed |= 1<<n;. 
7fe0: 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65   }..lookupname_e
7ff0: 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75  nd:.  /* Clean u
8000: 70 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  p and return.  *
8010: 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  /.  sqliteFree(z
8020: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  Db);.  sqliteFre
8030: 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  e(zTab);.  sqlit
8040: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
8050: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45  pr->pLeft);.  pE
8060: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
8070: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8080: 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ete(pExpr->pRigh
8090: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  t);.  pExpr->pRi
80a0: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72  ght = 0;.  pExpr
80b0: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
80c0: 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  ;.lookupname_end
80d0: 5f 32 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  _2:.  sqliteFree
80e0: 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e  (zCol);.  if( cn
80f0: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65  t==1 ){.    asse
8100: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
8110: 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61    sqlite3AuthRea
8120: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
8130: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b   pNC->pSrcList);
8140: 0a 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20  .    if( pMatch 
8150: 26 26 20 21 70 4d 61 74 63 68 2d 3e 70 53 65 6c  && !pMatch->pSel
8160: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ect ){.      pEx
8170: 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61 74 63  pr->pTab = pMatc
8180: 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 20  h->pTab;.    }. 
8190: 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
81a0: 74 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f  the nRef value o
81b0: 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65  n all name conte
81c0: 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75  xts from TopNC u
81d0: 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  p to.    ** the 
81e0: 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  point where the 
81f0: 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f  name matched. */
8200: 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
8210: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
8220: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  NC!=0 );.      p
8230: 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  TopNC->nRef++;. 
8240: 20 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d       if( pTopNC=
8250: 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20  =pNC ) break;.  
8260: 20 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f      pTopNC = pTo
8270: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
8280: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
8290: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
82a0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
82b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
82c0: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
82d0: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
82e0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
82f0: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d  *.** Resolve sym
8300: 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f  bolic names into
8310: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61   TK_COLUMN opera
8320: 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72  tors for the cur
8330: 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20  rent.** node in 
8340: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
8350: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74  ree.  Return 0 t
8360: 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73  o continue the s
8370: 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68  earch down.** th
8380: 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61  e tree or 2 to a
8390: 62 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61  bort the tree wa
83a0: 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  lk..**.** This r
83b0: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
83c0: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
83d0: 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  and name resolut
83e0: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74  ion for.** funct
83f0: 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20  ion names.  The 
8400: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67  operator for agg
8410: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
8420: 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74   is changed.** t
8430: 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  o TK_AGG_FUNCTIO
8440: 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  N..*/.static int
8450: 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65   nameResolverSte
8460: 70 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78  p(void *pArg, Ex
8470: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61  pr *pExpr){.  Na
8480: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
8490: 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 70   (NameContext*)p
84a0: 41 72 67 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Arg;.  SrcList *
84b0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 50 61 72 73  pSrcList;.  Pars
84c0: 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66  e *pParse;..  if
84d0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
84e0: 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28  urn 1;.  assert(
84f0: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 53 72   pNC!=0 );.  pSr
8500: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
8510: 63 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 20  cList;.  pParse 
8520: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 0a  = pNC->pParse;..
8530: 20 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79    if( ExprHasAny
8540: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8550: 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72  EP_Resolved) ) r
8560: 65 74 75 72 6e 20 31 3b 0a 20 20 45 78 70 72 53  eturn 1;.  ExprS
8570: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
8580: 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a  , EP_Resolved);.
8590: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
85a0: 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 26 26   if( pSrcList &&
85b0: 20 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   pSrcList->nAllo
85c0: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  c>0 ){.    int i
85d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
85e0: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
85f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
8600: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
8610: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
8620: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
8630: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
8640: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
8650: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
8660: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
8670: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
8680: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
8690: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
86a0: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
86b0: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
86c0: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
86d0: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
86e0: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
86f0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
8700: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
8710: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
8720: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
8730: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
8740: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
8750: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
8760: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
8770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
8780: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
8790: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
87a0: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
87b0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
87c0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
87d0: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
87e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
87f0: 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  a column..    */
8800: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
8810: 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   {.      lookupN
8820: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
8830: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
8840: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
8850: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8860: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
8870: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
8880: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
8890: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
88a0: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
88b0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
88c0: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
88d0: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
88e0: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
88f0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f  Column;.      To
8900: 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20  ken *pTable;.   
8910: 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20     Token *pDb;. 
8920: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
8930: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
8940: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
8950: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
8960: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
8970: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
8980: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
8990: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ID ){.        pD
89a0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
89b0: 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e  Table = &pExpr->
89c0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
89d0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
89e0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  &pRight->token;.
89f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8a00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
8a10: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
8a20: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  );.        pDb =
8a30: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
8a40: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
8a50: 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d  Table = &pRight-
8a60: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
8a70: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
8a80: 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74   &pRight->pRight
8a90: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
8aa0: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
8ab0: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
8ac0: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
8ad0: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
8ae0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8af0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
8b00: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
8b10: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
8b20: 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
8b30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
8b40: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
8b50: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
8b60: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
8b70: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
8b80: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
8b90: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
8ba0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
8bb0: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
8bc0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
8bd0: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
8be0: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
8bf0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
8c00: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
8c10: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
8c20: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
8c30: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8c40: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
8c50: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8c60: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
8c70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8c80: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
8c90: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
8ca0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
8cb0: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t i;.      int n
8cc0: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
8cd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8ce0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
8cf0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  n function name 
8d00: 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
8d10: 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
8d20: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
8d30: 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  tion name. */.  
8d40: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
8d50: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8d60: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
8d70: 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f  bout the functio
8d80: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  n */.      int e
8d90: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
8da0: 3e 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61  >enc;  /* The da
8db0: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
8dc0: 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20  */..      zId = 
8dd0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
8de0: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
8df0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
8e00: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
8e10: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
8e20: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
8e30: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
8e40: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
8e50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
8e60: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
8e70: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
8e80: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c  b, zId, nId, -1,
8e90: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
8ea0: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
8eb0: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
8ec0: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
8ed0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8ee0: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
8ef0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
8f00: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
8f10: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
8f20: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
8f30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8f40: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 70  if( is_agg && !p
8f50: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a  NC->allowAgg ){.
8f60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8f70: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8f80: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
8f90: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
8fa0: 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b  *s()", nId,zId);
8fb0: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
8fc0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
8fd0: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
8fe0: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
8ff0: 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  h_func ){.      
9000: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9010: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
9020: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  ch function: %.*
9030: 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  s", nId, zId);. 
9040: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
9050: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
9060: 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  if( wrong_num_ar
9070: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gs ){.        sq
9080: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9090: 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62  arse,"wrong numb
90a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
90b0: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  to function %.*s
90c0: 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ()",.           
90d0: 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20    nId, zId);.   
90e0: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
90f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9100: 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20  if( is_agg ){.  
9110: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
9120: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
9130: 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  N;.        pNC->
9140: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  hasAgg = 1;.    
9150: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
9160: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
9170: 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  wAgg = 0;.      
9180: 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45  for(i=0; pNC->nE
9190: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
91a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b  +){.        walk
91b0: 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e  ExprTree(pList->
91c0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65  a[i].pExpr, name
91d0: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
91e0: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
91f0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
9200: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  NC->allowAgg = 1
9210: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d  ;.      /* FIX M
9220: 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70  E:  Compute pExp
9230: 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65  r->affinity base
9240: 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65  d on the expecte
9250: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  d return.      *
9260: 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75  * type of the fu
9270: 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f  nction .      */
9280: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73  .      return is
9290: 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  _agg;.    }.#ifn
92a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
92b0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
92c0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
92d0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
92e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
92f0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
9300: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
9310: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ct ){.        in
9320: 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52  t nRef = pNC->nR
9330: 65 66 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ef;.#ifndef SQLI
9340: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
9350: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
9360: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
9370: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9380: 4d 73 67 28 70 50 61 72 73 65 2c 22 73 75 62 71  Msg(pParse,"subq
9390: 75 65 72 69 65 73 20 70 72 6f 68 69 62 69 74 65  ueries prohibite
93a0: 64 20 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74  d in CHECK const
93b0: 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  raints");.      
93c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
93d0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
93e0: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
93f0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
9400: 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73  pNC);.        as
9410: 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e  sert( pNC->nRef>
9420: 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20  =nRef );.       
9430: 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e   if( nRef!=pNC->
9440: 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nRef ){.        
9450: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
9460: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
9470: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
9480: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
94a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
94b0: 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65 20  _CHECK.    case 
94c0: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
94d0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73       if( pNC->is
94e0: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Check ){.       
94f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9500: 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65 74  (pParse,"paramet
9510: 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  ers prohibited i
9520: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
9530: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  nts");.      }. 
9540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9550: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
9560: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9570: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
9580: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
9590: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
95a0: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
95b0: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
95c0: 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74  mns.  Nodes of t
95d0: 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72  he form ID.ID or
95e0: 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f   ID resolve into
95f0: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20   an.** index to 
9600: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
9610: 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20   table list and 
9620: 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e  a column offset.
9630: 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f    The .** Expr.o
9640: 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e  pcode for such n
9650: 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20  odes is changed 
9660: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54  to TK_COLUMN.  T
9670: 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a  he Expr.iTable.*
9680: 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  * value is chang
9690: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
96a0: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
96b0: 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  d table in pTabL
96c0: 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20  ist.** plus the 
96d0: 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54  "base" value.  T
96e0: 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69  he base value wi
96f0: 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
9700: 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45  come the.** VDBE
9710: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
9720: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
9730: 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
9740: 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  o the referenced
9750: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20  .** table.  The 
9760: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
9770: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
9780: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
9790: 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20  e column .** of 
97a0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
97b0: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
97c0: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f  iColumn value fo
97d0: 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  r the special.**
97e0: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73   ROWID column is
97f0: 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45   -1.  Any INTEGE
9800: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
9810: 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73  lumn is tried as
9820: 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72   an.** alias for
9830: 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c   ROWID..**.** Al
9840: 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74  so resolve funct
9850: 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68  ion names and ch
9860: 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  eck the function
9870: 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20  s for proper.** 
9880: 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72  usage.  Make sur
9890: 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e  e all function n
98a0: 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69  ames are recogni
98b0: 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63  zed and all func
98c0: 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68  tions.** have th
98d0: 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
98e0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
98f0: 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  Leave an error m
9900: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
9910: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20  rse->zErrMsg if 
9920: 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73  anything is amis
9930: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
9940: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
9950: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
9960: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
9970: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
9980: 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74  tions then set t
9990: 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f  he EP_Agg.** pro
99a0: 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70  perty on the exp
99b0: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ression..*/.int 
99c0: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
99d0: 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43  veNames(.  NameC
99e0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
99f0: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
9a00: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
9a10: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
9a20: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
9a30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
9a40: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
9a50: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
9a60: 20 20 69 6e 74 20 73 61 76 65 64 48 61 73 41 67    int savedHasAg
9a70: 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  g;.  if( pExpr==
9a80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9a90: 73 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e  savedHasAgg = pN
9aa0: 43 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43  C->hasAgg;.  pNC
9ab0: 2d 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20  ->hasAgg = 0;.  
9ac0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78  walkExprTree(pEx
9ad0: 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  pr, nameResolver
9ae0: 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66  Step, pNC);.  if
9af0: 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b  ( pNC->nErr>0 ){
9b00: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
9b10: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
9b20: 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rror);.  }.  if(
9b30: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a   pNC->hasAgg ){.
9b40: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
9b50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67  rty(pExpr, EP_Ag
9b60: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
9b70: 73 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20  savedHasAgg ){. 
9b80: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
9b90: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
9ba0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9bb0: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
9bc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f  );.}../*.** A po
9bd0: 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f  inter instance o
9be0: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
9bf0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73   is used to pass
9c00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
9c10: 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72  through walkExpr
9c20: 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75  Tree into codeSu
9c30: 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f  bqueryStep()..*/
9c40: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
9c50: 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72 79  QueryCoder Query
9c60: 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75  Coder;.struct Qu
9c70: 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72  eryCoder {.  Par
9c80: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
9c90: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
9ca0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61   context */.  Na
9cb0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20  meContext *pNC; 
9cc0: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
9cd0: 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69  of first enclosi
9ce0: 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a  ng query */.};..
9cf0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9d00: 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20  code for scalar 
9d10: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
9d20: 61 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  as an expression
9d30: 0a 2a 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61  .** and IN opera
9d40: 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a  tors.  Examples:
9d50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45  .**.**     (SELE
9d60: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
9d70: 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72        -- subquer
9d80: 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20  y.**     EXISTS 
9d90: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
9da0: 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75  )   -- EXISTS su
9db0: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20  bquery.**     x 
9dc0: 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20  IN (4,5,11)     
9dd0: 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f           -- IN o
9de0: 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73  perator with lis
9df0: 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20  t on right-hand 
9e00: 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e  side.**     x IN
9e10: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
9e20: 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65  b)     -- IN ope
9e30: 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71 75  rator with subqu
9e40: 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ery on the right
9e50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72  .**.** The pExpr
9e60: 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63 72   parameter descr
9e70: 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ibes the express
9e80: 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ion that contain
9e90: 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72  s the IN.** oper
9ea0: 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79  ator or subquery
9eb0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9ec0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9ed0: 59 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  Y.void sqlite3Co
9ee0: 64 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73  deSubselect(Pars
9ef0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
9f00: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 74  *pExpr){.  int t
9f10: 65 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20  estAddr = 0;    
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f30: 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74     /* One-time t
9f40: 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20  est address */. 
9f50: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
9f60: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
9f70: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
9f80: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
9f90: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
9fa0: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
9fb0: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
9fc0: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
9fd0: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
9fe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
9ff0: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
a000: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
a010: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
a020: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
a030: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
a040: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
a050: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
a060: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
a070: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
a080: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
a090: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
a0a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
a0b0: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
a0c0: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
a0d0: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
a0e0: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
a0f0: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
a100: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
a110: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
a120: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
a130: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
a140: 20 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79   if( !ExprHasAny
a150: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a160: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26  EP_VarSelect) &&
a170: 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74   !pParse->trigSt
a180: 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  ack ){.    int m
a190: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
a1a0: 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  m++;.    sqlite3
a1b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a1c0: 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29  MemLoad, mem, 0)
a1d0: 3b 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d  ;.    testAddr =
a1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a1f0: 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30  p(v, OP_If, 0, 0
a200: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74  );.    assert( t
a210: 65 73 74 41 64 64 72 3e 30 20 7c 7c 20 73 71 6c  estAddr>0 || sql
a220: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
a230: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
a240: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a250: 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29  _MemInt, 1, mem)
a260: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
a270: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
a280: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
a290: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69 6e        char affin
a2a0: 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  ity;.      KeyIn
a2b0: 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  fo keyInfo;.    
a2c0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
a2d0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
a2e0: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20   OP_OpenVirtual 
a2f0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  instruction */..
a300: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
a310: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
a320: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
a330: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  t);..      /* Wh
a340: 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
a350: 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
a360: 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
a370: 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
a380: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
a390: 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
a3a0: 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69  e same way. A vi
a3b0: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  rtual table is .
a3c0: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
a3d0: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
a3e0: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
a3f0: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
a400: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
a410: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
a420: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
a430: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
a440: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
a450: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
a460: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
a470: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
a480: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
a490: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
a4a0: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
a4b0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
a4c0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
a4d0: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
a4e0: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
a4f0: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
a500: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
a510: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
a520: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
a530: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
a540: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
a550: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
a560: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
a570: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
a580: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
a590: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
a5a0: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
a5b0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
a5c0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
a5d0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a5e0: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
a5f0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
a600: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
a610: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
a620: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
a630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a640: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
a650: 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  al, pExpr->iTabl
a660: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d  e, 0);.      mem
a670: 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c  set(&keyInfo, 0,
a680: 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29   sizeof(keyInfo)
a690: 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  );.      keyInfo
a6a0: 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20  .nField = 1;.   
a6b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a6c0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
a6d0: 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e  Columns, pExpr->
a6e0: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20  iTable, 1);..   
a6f0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
a700: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
a710: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20   /* Case 1:     
a720: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
a730: 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ...).        **.
a740: 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72          ** Gener
a750: 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74  ate code to writ
a760: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
a770: 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f   the select into
a780: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
a790: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
a7a0: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70  allocated and op
a7b0: 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20  ened above..    
a7c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
a7d0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72  nt iParm = pExpr
a7e0: 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69  ->iTable +  (((i
a7f0: 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36  nt)affinity)<<16
a800: 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  );.        ExprL
a810: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
a820: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45       assert( (pE
a830: 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30  xpr->iTable&0x00
a840: 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e  00FFFF)==pExpr->
a850: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  iTable );.      
a860: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
a870: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a880: 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c  Select, SRT_Set,
a890: 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c   iParm, 0, 0, 0,
a8a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c   0);.        pEL
a8b0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  ist = pExpr->pSe
a8c0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
a8d0: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
a8e0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
a8f0: 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20  r>0 ){ .        
a900: 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b    keyInfo.aColl[
a910: 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  0] = binaryCompa
a920: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
a930: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a  , pExpr->pLeft,.
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
a950: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
a960: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a970: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
a980: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
a990: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
a9a0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70      expr IN (exp
a9b0: 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a  rlist).        *
a9c0: 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68 20 65  *..** For each e
a9d0: 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
a9e0: 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
a9f0: 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
aa00: 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
aa10: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
aa20: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
aa30: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
aa40: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
aa50: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
aa60: 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
aa70: 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
aa80: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
aa90: 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
aaa0: 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
aab0: 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
aac0: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
aad0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
aae0: 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
aaf0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
ab00: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
ab10: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
ab20: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
ab30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
ab40: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
ab50: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
ab60: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
ab70: 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
ab80: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
ab90: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
aba0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
abb0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
abc0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
abd0: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
abe0: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
abf0: 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78  for(i=pList->nEx
ac00: 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  pr, pItem=pList-
ac10: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
ac20: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
ac30: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49    Expr *pE2 = pI
ac40: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
ac50: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
ac60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
ac70: 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
ac80: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
ac90: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
aca0: 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
acb0: 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
acc0: 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
acd0: 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
ace0: 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
acf0: 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
ad00: 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
ad10: 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
ad20: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
ad30: 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
ad40: 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
ad50: 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
ad60: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ad70: 20 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72      if( testAddr
ad80: 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  >0 && !sqlite3Ex
ad90: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
ada0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
adb0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 73   VdbeOp *aOp = s
adc0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
add0: 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29 3b 0a  v, testAddr-1);.
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
adf0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  i;.            f
ae00: 6f 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b  or(i=0; i<3; i++
ae10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ae20: 20 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 3d   aOp[i].opcode =
ae30: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
ae40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ae50: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 30      testAddr = 0
ae60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
ae70: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
ae80: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
ae90: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
aea0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
aeb0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
aec0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
aed0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b  de(pParse, pE2);
aee0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
aef0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
af00: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
af10: 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
af20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
af30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
af40: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
af50: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
af60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
af70: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
af80: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
af90: 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65  ddr, (void *)&ke
afa0: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
afb0: 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  O);.      break;
afc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
afd0: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
afe0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
aff0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
b000: 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c  has to be a scal
b010: 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65  ar SELECT.  Gene
b020: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
b030: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61   the.      ** va
b040: 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65  lue of this sele
b050: 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63  ct in a memory c
b060: 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  ell and record t
b070: 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  he number.      
b080: 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** of the memory
b090: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
b0a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b0b0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f   static const To
b0c0: 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22 2c  ken one = { "1",
b0d0: 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 53   0, 1 };.      S
b0e0: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
b0f0: 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 20     int iMem;.   
b100: 20 20 20 69 6e 74 20 73 6f 70 3b 0a 0a 20 20 20     int sop;..   
b110: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
b120: 6e 20 3d 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  n = iMem = pPars
b130: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
b140: 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70   pSel = pExpr->p
b150: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66  Select;.      if
b160: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b170: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
b180: 20 20 73 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b    sop = SRT_Mem;
b190: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b1a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b1b0: 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c 20 30  MemNull, iMem, 0
b1c0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b1d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e  omment((v, "# In
b1e0: 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73 75  it subquery resu
b1f0: 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lt"));.      }el
b200: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20  se{.        sop 
b210: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
b220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b230: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
b240: 49 6e 74 2c 20 30 2c 20 69 4d 65 6d 29 3b 0a 20  Int, 0, iMem);. 
b250: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
b260: 6e 74 28 28 76 2c 20 22 23 20 49 6e 69 74 20 45  nt((v, "# Init E
b270: 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
b280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b290: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
b2a0: 28 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a  (pSel->pLimit);.
b2b0: 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
b2c0: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
b2d0: 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20  (TK_INTEGER, 0, 
b2e0: 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20 20 20  0, &one);.      
b2f0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
b300: 61 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c  arse, pSel, sop,
b310: 20 69 4d 65 6d 2c 20 30 2c 20 30 2c 20 30 2c 20   iMem, 0, 0, 0, 
b320: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
b330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
b340: 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a 20 20  ( testAddr ){.  
b350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
b360: 70 48 65 72 65 28 76 2c 20 74 65 73 74 41 64 64  pHere(v, testAdd
b370: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
b380: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b390: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b3a0: 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  RY */../*.** Gen
b3b0: 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
b3c0: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
b3d0: 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
b3e0: 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
b3f0: 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20  xt z[0..n-1] on 
b400: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74  the stack..*/.st
b410: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
b420: 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63  teger(Vdbe *v, c
b430: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
b440: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t n){.  int i;. 
b450: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
b460: 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20  nt32(z, &i) ){. 
b470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b480: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b490: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  r, i, 0);.  }els
b4a0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74  e if( sqlite3Fit
b4b0: 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a  sIn64Bits(z) ){.
b4c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
b4d0: 70 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20  p3(v, OP_Int64, 
b4e0: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d  0, 0, z, n);.  }
b4f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b500: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52  3VdbeOp3(v, OP_R
b510: 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29  eal, 0, 0, z, n)
b520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
b530: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
b540: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
b550: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
b560: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
b570: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
b580: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74   the result on t
b590: 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e  he top of stack.
b5a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
b5b0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
b5c0: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
b5d0: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
b5e0: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
b5f0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
b600: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
b610: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
b620: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
b630: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
b640: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
b650: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
b660: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
b670: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
b680: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
b690: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
b6a0: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
b6b0: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
b6c0: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
b6d0: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
b6e0: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
b6f0: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
b700: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
b710: 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
b720: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
b730: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
b740: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
b750: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
b760: 6e 74 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31  nt stackChng = 1
b770: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
b780: 66 20 63 68 61 6e 67 65 20 74 6f 20 73 74 61 63  f change to stac
b790: 6b 20 64 65 70 74 68 20 2a 2f 0a 0a 20 20 69 66  k depth */..  if
b7a0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b7b0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
b7c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b7d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
b7e0: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  ll, 0, 0);.    r
b7f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20  eturn;.  }.  op 
b800: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
b810: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
b820: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
b830: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67  UMN: {.      Agg
b840: 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d  Info *pAggInfo =
b850: 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
b860: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41  ;.      struct A
b870: 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
b880: 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43   = &pAggInfo->aC
b890: 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b  ol[pExpr->iAgg];
b8a0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67  .      if( !pAgg
b8b0: 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
b8c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b8d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b8e0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 43 6f 6c  OP_MemLoad, pCol
b8f0: 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
b900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b910: 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
b920: 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
b930: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
b940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b950: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
b960: 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
b970: 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
b9a0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 62  lumn);.        b
b9b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b9c0: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
b9d0: 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
b9e0: 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
b9f0: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
ba00: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
ba10: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
ba20: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
ba30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
ba40: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
ba50: 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20 63  n coding check c
ba60: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
ba70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ba80: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3e 30  arse->ckOffset>0
ba90: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
baa0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bab0: 4f 50 5f 44 75 70 2c 20 70 50 61 72 73 65 2d 3e  OP_Dup, pParse->
bac0: 63 6b 4f 66 66 73 65 74 2d 70 45 78 70 72 2d 3e  ckOffset-pExpr->
bad0: 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31 29 3b 0a 20  iColumn-1, 1);. 
bae0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
baf0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
bb00: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c   ){.        Tabl
bb10: 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
bb20: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
bb30: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
bb40: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
bb50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bb60: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
bb70: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
bb80: 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  iCol);.        s
bb90: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
bba0: 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
bbb0: 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
bbc0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
bbd0: 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 20 69  _POINT.        i
bbe0: 66 28 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  f( pTab && pTab-
bbf0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69  >aCol[iCol].affi
bc00: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
bc10: 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  _REAL ){.       
bc20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bc30: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c 41 66  dOp(v, OP_RealAf
bc40: 66 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b 0a 20  finity, 0, 0);. 
bc50: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
bc60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bc70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bc80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
bc90: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
bca0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
bcb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bcc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
bcd0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
bce0: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78  deInteger(v, pEx
bcf0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
bd00: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
bd10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bd20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
bd30: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
bd40: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
bd50: 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54  assert( TK_FLOAT
bd60: 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20  ==OP_Real );.   
bd70: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54     assert( TK_ST
bd80: 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38  RING==OP_String8
bd90: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
bda0: 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 45 78  3DequoteExpr(pEx
bdb0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
bdc0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c  e3VdbeOp3(v, op,
bdd0: 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f   0, 0, pExpr->to
bde0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
bdf0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
be00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
be10: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
be20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
be30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
be40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
be50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
be60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
be70: 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
be80: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
be90: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
bea0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
beb0: 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
bec0: 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78   TK_BLOB==OP_Hex
bed0: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20  Blob );.      n 
bee0: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
bef0: 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20   - 3;.      z = 
bf00: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b  pExpr->token.z +
bf10: 20 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   2;.      assert
bf20: 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( n>=0 );.      
bf30: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
bf40: 20 20 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20      z = "";.    
bf50: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
bf60: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
bf70: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  0, 0, z, n);.   
bf80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bf90: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
bfa0: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
bfb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bfc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69  AddOp(v, OP_Vari
bfd0: 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61  able, pExpr->iTa
bfe0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ble, 0);.      i
bff0: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
c000: 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  n>1 ){.        s
c010: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c020: 50 33 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d  P3(v, -1, pExpr-
c030: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
c040: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
c050: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c060: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c070: 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
c080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c090: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
c0a0: 61 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ad, pExpr->iTabl
c0b0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  e, 0);.      bre
c0c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
c0d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
c0e0: 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
c0f0: 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
c100: 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
c110: 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
c120: 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
c130: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
c140: 2c 20 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  , op;.      sqli
c150: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c160: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c170: 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 73  );.      aff = s
c180: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
c190: 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  pe(&pExpr->token
c1a0: 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 66  );.      op = af
c1b0: 66 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f - SQLITE_AFF_T
c1c0: 45 58 54 20 2b 20 4f 50 5f 54 6f 54 65 78 74 3b  EXT + OP_ToText;
c1d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
c1e0: 70 3d 3d 4f 50 5f 54 6f 54 65 78 74 20 20 20 20  p==OP_ToText    
c1f0: 7c 7c 20 61 66 66 21 3d 53 51 4c 49 54 45 5f 41  || aff!=SQLITE_A
c200: 46 46 5f 54 45 58 54 20 20 20 20 29 3b 0a 20 20  FF_TEXT    );.  
c210: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
c220: 4f 50 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20  OP_ToBlob    || 
c230: 61 66 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff!=SQLITE_AFF_
c240: 4e 4f 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20  NONE    );.     
c250: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f   assert( op==OP_
c260: 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66 66  ToNumeric || aff
c270: 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  !=SQLITE_AFF_NUM
c280: 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61 73  ERIC );.      as
c290: 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f 49  sert( op==OP_ToI
c2a0: 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
c2b0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c2c0: 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
c2d0: 74 28 20 6f 70 3d 3d 4f 50 5f 54 6f 52 65 61 6c  t( op==OP_ToReal
c2e0: 20 20 20 20 7c 7c 20 61 66 66 21 3d 53 51 4c 49      || aff!=SQLI
c2f0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 29  TE_AFF_REAL    )
c300: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c310: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
c320: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61  0, 0);.      sta
c330: 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ckChng = 0;.    
c340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
c350: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c360: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
c370: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
c380: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
c390: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
c3a0: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
c3b0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
c3c0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
c3d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c3e0: 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
c3f0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
c400: 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
c410: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
c420: 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
c430: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
c440: 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
c450: 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
c460: 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
c470: 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
c480: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c490: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c4a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
c4b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c4c0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c4d0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c4e0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
c4f0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c500: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
c510: 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  ght, op, 0, 0);.
c520: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
c530: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
c540: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c550: 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61  e TK_AND:.    ca
c560: 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61  se TK_OR:.    ca
c570: 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20  se TK_PLUS:.    
c580: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20  case TK_STAR:.  
c590: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
c5a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
c5b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
c5c0: 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  TAND:.    case T
c5d0: 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73  K_BITOR:.    cas
c5e0: 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20  e TK_SLASH:.    
c5f0: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
c600: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
c610: 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b  FT: .    case TK
c620: 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
c630: 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d   assert( TK_AND=
c640: 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20  =OP_And );.     
c650: 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d   assert( TK_OR==
c660: 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  OP_Or );.      a
c670: 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
c680: 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20  OP_Add );.      
c690: 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53  assert( TK_MINUS
c6a0: 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b  ==OP_Subtract );
c6b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c6c0: 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
c6d0: 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  der );.      ass
c6e0: 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
c6f0: 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20  OP_BitAnd );.   
c700: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
c710: 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
c720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c730: 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
c740: 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  de );.      asse
c750: 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
c760: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20  P_ShiftLeft );. 
c770: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c780: 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74  RSHIFT==OP_Shift
c790: 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61  Right );.      a
c7a0: 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54  ssert( TK_CONCAT
c7b0: 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20  ==OP_Concat );. 
c7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c7d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c7e0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c7f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c800: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c810: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
c820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c830: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
c840: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
c850: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
c860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c870: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
c880: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
c890: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
c8a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
c8b0: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
c8c0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
c8d0: 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f  LOAT || pLeft->o
c8e0: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
c8f0: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  .        Token *
c900: 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  p = &pLeft->toke
c910: 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
c920: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  *z = sqlite3MPri
c930: 6e 74 66 28 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e  ntf("-%.*s", p->
c940: 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  n, p->z);.      
c950: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
c960: 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
c970: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c980: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c  beOp3(v, OP_Real
c990: 2c 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b  , 0, 0, z, p->n+
c9a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
c9b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  e{.          cod
c9c0: 65 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70  eInteger(v, z, p
c9d0: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
c9e0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
c9f0: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  Free(z);.       
ca00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ca10: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
ca20: 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f  rough into TK_NO
ca30: 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  T */.    }.    c
ca40: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
ca50: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
ca60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ca70: 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
ca80: 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73  tNot );.      as
ca90: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
caa0: 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71  _Not );.      sq
cab0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
cac0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
cad0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
cae0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
caf0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
cb00: 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20  stackChng = 0;. 
cb10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cb20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
cb30: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
cb40: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
cb50: 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20     int dest;.   
cb60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
cb70: 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
cb80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cb90: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
cba0: 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  NotNull );.     
cbb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cbc0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
cbd0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
cbe0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
cbf0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
cc00: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
cc10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
cc20: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
cc30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cc40: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
cc50: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
cc60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cc70: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
cc80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
cc90: 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  kChng = 0;.     
cca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ccb0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
ccc0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
ccd0: 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d  AggInfo *pInfo =
cce0: 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
ccf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
cd00: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
cd10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
cd20: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
cd30: 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 54  of aggregate: %T
cd40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  ",.            &
cd50: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
cd60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cd70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cd80: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
cd90: 64 2c 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  d, pInfo->aFunc[
cda0: 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
cdb0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
cdc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cdd0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
cde0: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
cdf0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
ce00: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
ce10: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
ce20: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  >pList;.      in
ce30: 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20  t nExpr = pList 
ce40: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
ce50: 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   0;.      FuncDe
ce60: 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
ce70: 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f  nt nId;.      co
ce80: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20  nst char *zId;. 
ce90: 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61       int constMa
cea0: 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
ceb0: 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  t i;.      u8 en
cec0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
ced0: 65 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  enc;.      CollS
cee0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
cef0: 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
cf00: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
cf10: 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   nId = pExpr->to
cf20: 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65  ken.n;.      pDe
cf30: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
cf40: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
cf50: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45  db, zId, nId, nE
cf60: 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  xpr, enc, 0);.  
cf70: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
cf80: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  !=0 );.      nEx
cf90: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
cfa0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
cfb0: 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  rse, pList);.   
cfc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
cfd0: 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b  xpr && i<32; i++
cfe0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
cff0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
d000: 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  tant(pList->a[i]
d010: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
d020: 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
d030: 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20  = (1<<i);.      
d040: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d050: 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  pDef->needCollSe
d060: 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  q && !pColl ){. 
d070: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
d080: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
d090: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
d0a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
d0b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d0c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  }.      if( pDef
d0d0: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
d0e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
d0f0: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  oll ) pColl = pP
d100: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
d110: 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
d120: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d130: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
d140: 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
d150: 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
d160: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d170: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
d180: 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  _Function, const
d190: 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63 68  Mask, nExpr, (ch
d1a0: 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e  ar*)pDef, P3_FUN
d1b0: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 74 61  CDEF);.      sta
d1c0: 63 6b 43 68 6e 67 20 3d 20 31 2d 6e 45 78 70 72  ckChng = 1-nExpr
d1d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d1e0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
d1f0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
d200: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
d210: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
d220: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
d230: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
d240: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
d250: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
d260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d270: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78   OP_MemLoad, pEx
d280: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b  pr->iColumn, 0);
d290: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
d2a0: 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73  nt((v, "# load s
d2b0: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
d2c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d2d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d2e0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
d2f0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68  t addr;.      ch
d300: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
d310: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
d320: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
d330: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
d340: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
d350: 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
d360: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
d370: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
d380: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
d390: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
d3a0: 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
d3b0: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
d3c0: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
d3d0: 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f      ** P3 of OP_
d3e0: 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20  MakeRecord..    
d3f0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e    */.      affin
d400: 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
d410: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
d420: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
d430: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
d440: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 0a  nteger, 1, 0);..
d450: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
d460: 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
d470: 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
d480: 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   The temporary t
d490: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45  able.      ** pE
d4a0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74  xpr->iTable cont
d4b0: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
d4c0: 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
d4d0: 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20   (...) set..    
d4e0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
d4f0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d500: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
d510: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
d520: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d530: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
d540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d550: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
d560: 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20  -1, addr+4);    
d570: 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20          /* addr 
d580: 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 0 */.      sql
d590: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d5a0: 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
d5b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
d5d0: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
d5e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d5f0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
d600: 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73  addr+7);.      s
d610: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d620: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
d630: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
d640: 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b   1);   /* addr +
d650: 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69   4 */.      sqli
d660: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d670: 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
d680: 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29  >iTable, addr+7)
d690: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d6a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
d6b0: 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20  ddImm, -1, 0);  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a  /* addr + 6 */..
d6e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d6f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
d700: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
d710: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
d720: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
d730: 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
d740: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
d750: 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70  LItem = pExpr->p
d760: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45  List->a;.      E
d770: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c  xpr *pRight = pL
d780: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
d790: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d7a0: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
d7b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d7c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d7d0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
d7e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d7f0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
d800: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
d810: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
d820: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
d830: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
d840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d850: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
d860: 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  0);.      pLItem
d870: 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
d880: 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
d890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d8a0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d8b0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
d8c0: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
d8d0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
d8e0: 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Le, 0, 0);.
d8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d900: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64  eAddOp(v, OP_And
d910: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
d920: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d930: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20  case TK_UPLUS:. 
d940: 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
d950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d960: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d970: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
d980: 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20      stackChng = 
d990: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
d9a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d9b0: 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
d9c0: 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  int expr_end_lab
d9d0: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75  el;.      int ju
d9e0: 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e  mpInst;.      in
d9f0: 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  t nExpr;.      i
da00: 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72  nt i;.      Expr
da10: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
da20: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
da30: 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
da40: 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  lem;..      asse
da50: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  rt(pExpr->pList)
da60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28  ;.      assert((
da70: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
da80: 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
da90: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
daa0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
dab0: 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
dac0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
dad0: 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
dae0: 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
daf0: 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
db00: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
db10: 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62      expr_end_lab
db20: 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
db30: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
db40: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
db50: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
db60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
db70: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
db80: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Left);.      }. 
db90: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dba0: 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
dbb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
dbc0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
dbd0: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
dbe0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
dbf0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
dc00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dc10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
dc20: 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20  _Dup, 1, 1);.   
dc30: 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20         jumpInst 
dc40: 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50  = codeCompare(pP
dc50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
dc60: 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  ft, aListelem[i]
dc70: 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  .pExpr,.        
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20           OP_Ne, 
dca0: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 1);.         
dcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dcc0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
dcd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
dce0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  e{.          jum
dcf0: 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56  pInst = sqlite3V
dd00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
dd10: 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  fNot, 1, 0);.   
dd20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
dd30: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
dd40: 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
dd50: 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  [i+1].pExpr);.  
dd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
dd80: 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c  o, 0, expr_end_l
dd90: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
dda0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ddb0: 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b  re(v, jumpInst);
ddc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ddd0: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
dde0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ddf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
de00: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
de10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
de20: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
de30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
de40: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
de50: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
de60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
de70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
de80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
de90: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
dea0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
deb0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
dec0: 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  v, expr_end_labe
ded0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
dee0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
def0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
df00: 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
df10: 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  AISE: {.      if
df20: 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  ( !pParse->trigS
df30: 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
df40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
df50: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
df70: 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
df80: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
df90: 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
dfa0: 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  m");..return;.  
dfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
dfc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
dfd0: 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
dfe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
dff0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45  xpr->iColumn==OE
e000: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20  _Rollback ||.   
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
e020: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
e030: 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20  OE_Abort ||.    
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
e050: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
e060: 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
e070: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
e080: 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20  eExpr(pExpr);.  
e090: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e0a0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
e0b0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
e0c0: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
e0d0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
e0f0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
e100: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
e110: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
e120: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
e130: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
e140: 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20  OE_Ignore );.   
e150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e160: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
e170: 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  textPop, 0, 0);.
e180: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e190: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e1a0: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
e1b0: 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
e1c0: 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
e1d0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e1e0: 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52  , "# raise(IGNOR
e1f0: 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  E)"));.      }. 
e200: 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d       stackChng =
e210: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
e220: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e230: 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  }..  if( pParse-
e240: 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  >ckOffset ){.   
e250: 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65   pParse->ckOffse
e260: 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b 0a  t += stackChng;.
e270: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
e280: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b 0a  se->ckOffset );.
e290: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
e2a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
e2b0: 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  ER./*.** Generat
e2c0: 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
e2d0: 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
e2e0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
e2f0: 61 76 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  aves the result.
e300: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ** on the stack.
e310: 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74    See also sqlit
e320: 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a  e3ExprCode()..**
e330: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e340: 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63 68   might also cach
e350: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64  e the result and
e360: 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78 70   modify the pExp
e370: 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61  r tree.** so tha
e380: 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  t it will make u
e390: 73 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 64  se of the cached
e3a0: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
e3b0: 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e  quent evaluation
e3c0: 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  s.** rather than
e3d0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 77 68   evaluate the wh
e3e0: 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ole expression a
e3f0: 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20 65  gain.  Trivial e
e400: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a  xpressions are.*
e410: 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20 49  * not cached.  I
e420: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e430: 20 69 73 20 63 61 63 68 65 64 2c 20 69 74 73 20   is cached, its 
e440: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
e450: 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79   in a .** memory
e460: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   location..*/.vo
e470: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
e480: 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
e490: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
e4a0: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
e4b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
e4c0: 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20  e;.  int iMem;. 
e4d0: 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
e4e0: 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  2;.  if( v==0 ) 
e4f0: 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72 31 20  return;.  addr1 
e500: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
e510: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73  rentAddr(v);.  s
e520: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e530: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
e540: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
e550: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e560: 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32 3e  v);.  if( addr2>
e570: 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74  addr1+1 || sqlit
e580: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
e590: 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ddr1)->opcode==O
e5a0: 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20  P_Function ){.  
e5b0: 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e    iMem = pExpr->
e5c0: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
e5d0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
e5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e5f0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
e600: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45 78 70  em, 0);.    pExp
e610: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53  r->op = TK_REGIS
e620: 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  TER;.  }.}.#endi
e630: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
e640: 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
e650: 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
e660: 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
e670: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
e680: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e  pression list on
e690: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  to the stack..**
e6a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
e6b0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
e6c0: 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68  s pushed onto th
e6d0: 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  e stack..*/.int 
e6e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
e6f0: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
e700: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
e710: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
e720: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
e730: 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20  pList    /* The 
e740: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e750: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29  to be coded */.)
e760: 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
e770: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
e780: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
e790: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
e7a0: 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c  turn 0;.  n = pL
e7b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f  ist->nExpr;.  fo
e7c0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
e7d0: 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c  , i=n; i>0; i--,
e7e0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
e7f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e800: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
e810: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
e820: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
e830: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
e840: 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
e850: 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
e860: 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
e870: 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
e880: 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
e890: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
e8a0: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
e8b0: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
e8c0: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
e8d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
e8e0: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
e8f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
e900: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
e910: 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
e920: 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
e930: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
e940: 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
e950: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a   flag is true..*
e960: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
e970: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
e980: 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
e990: 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
e9a0: 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
e9b0: 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
e9c0: 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
e9d0: 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
e9e0: 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
e9f0: 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
ea00: 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
ea10: 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
ea20: 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
ea30: 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
ea40: 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
ea50: 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
ea60: 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
ea70: 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
ea80: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
ea90: 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
eaa0: 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
eab0: 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
eac0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ead0: 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
eae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
eaf0: 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
eb00: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
eb10: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
eb20: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
eb30: 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
eb40: 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
eb50: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
eb60: 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
eb70: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
eb80: 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b   op = pExpr->op;
eb90: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
eba0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
ebb0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
ebc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
ebd0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
ebe0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
ebf0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
ec00: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
ec10: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
ec20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
ec30: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
ec40: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
ec50: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
ec60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ec70: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
ec80: 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
ec90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
eca0: 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
ecb0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
ecc0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ecd0: 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
ece0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
ecf0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
ed00: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
ed10: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
ed20: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
ed30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ed40: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
ed50: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
ed60: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
ed70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ed80: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
ed90: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
eda0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
edb0: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
edc0: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
edd0: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
ede0: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
edf0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
ee00: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
ee10: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
ee20: 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
ee30: 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
ee40: 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
ee50: 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
ee60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ee70: 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
ee80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ee90: 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
eea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
eeb0: 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
eec0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
eed0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
eee0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
eef0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ef00: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ef10: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
ef20: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
ef30: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
ef40: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
ef50: 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  op, dest, jumpIf
ef60: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
ef70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ef80: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
ef90: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
efa0: 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L: {.      asser
efb0: 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
efc0: 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
efd0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
efe0: 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
eff0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f000: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f010: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
f020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f030: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
f040: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
f050: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f060: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
f070: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
f080: 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54  xpression "x BET
f090: 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73  WEEN y AND z" is
f0a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
f0b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
f0c0: 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29 20  ** 1 IF (x < y) 
f0d0: 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20  GOTO 3.      ** 
f0e0: 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f  2 IF (x <= z) GO
f0f0: 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
f100: 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ** 3 ....      *
f110: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
f120: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
f130: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
f140: 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ft;.      Expr *
f150: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
f160: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
f170: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
f180: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f190: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
f1a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f1b0: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
f1c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f1d0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f1e0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
f1f0: 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72  ddr = codeCompar
f200: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
f210: 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20   pRight, OP_Lt, 
f220: 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  0, !jumpIfNull);
f230: 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ..      pRight =
f240: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
f250: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
f260: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f270: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
f280: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
f290: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
f2a0: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65  t, pRight, OP_Le
f2b0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
f2c0: 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ll);..      sqli
f2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f2e0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
f2f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f300: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f310: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  addr);.      sql
f320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f330: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
f340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f350: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
f360: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f370: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f380: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
f390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f3a0: 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e  , OP_If, jumpIfN
f3b0: 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
f3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f3d0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f   }.  pParse->ckO
f3e0: 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74  ffset = ckOffset
f3f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
f400: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
f410: 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
f420: 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
f430: 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
f440: 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
f450: 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
f460: 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74  ion is false but
f470: 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
f480: 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
f490: 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
f4a0: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e  ression is true.
f4b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
f4c0: 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74  pression evaluat
f4d0: 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74  es to NULL (neit
f4e0: 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c  her true nor fal
f4f0: 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70  se) then.** jump
f500: 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
f510: 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74  s true or fall t
f520: 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66  hrough if jumpIf
f530: 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a  Null is false..*
f540: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
f550: 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
f560: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
f570: 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
f580: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
f590: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
f5a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
f5b0: 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
f5c0: 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73  ckOffset = pPars
f5d0: 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20 69  e->ckOffset;.  i
f5e0: 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
f5f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
f600: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
f610: 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f   pExpr->op and o
f620: 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73  p are related as
f630: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
f640: 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d   **       pExpr-
f650: 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f  >op            o
f660: 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  p.  **       ---
f670: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20  ------          
f680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
f690: 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20        TK_ISNULL 
f6a0: 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e           OP_NotN
f6b0: 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
f6c0: 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20  K_NOTNULL       
f6d0: 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a    OP_IsNull.  **
f6e0: 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20         TK_NE    
f6f0: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a            OP_Eq.
f700: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51    **       TK_EQ
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
f720: 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Ne.  **       T
f730: 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20  K_GT            
f740: 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20    OP_Le.  **    
f750: 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20     TK_LE        
f760: 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a        OP_Gt.  **
f770: 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20         TK_GE    
f780: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a            OP_Lt.
f790: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54    **       TK_LT
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
f7b0: 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f  _Ge.  **.  ** Fo
f7c0: 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  r other values o
f7d0: 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20  f pExpr->op, op 
f7e0: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  is undefined and
f7f0: 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68   unused..  ** Th
f800: 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61  e value of TK_ a
f810: 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
f820: 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75   are arranged su
f830: 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20  ch that we.  ** 
f840: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20  can compute the 
f850: 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73  mapping above us
f860: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
f870: 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  g expression..  
f880: 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72  ** Assert()s ver
f890: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ify that the com
f8a0: 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72  putation is corr
f8b0: 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ect..  */.  op =
f8c0: 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b   ((pExpr->op+(TK
f8d0: 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28  _ISNULL&1))^1)-(
f8e0: 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20  TK_ISNULL&1);.. 
f8f0: 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65   /* Verify corre
f900: 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  ct alignment of 
f910: 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
f920: 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  tants.  */.  ass
f930: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
f940: 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  TK_ISNULL || op=
f950: 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
f960: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
f970: 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c  op!=TK_NOTNULL |
f980: 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  | op==OP_IsNull 
f990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
f9a0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c  pr->op!=TK_NE ||
f9b0: 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20   op==OP_Eq );.  
f9c0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
f9d0: 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d  p!=TK_EQ || op==
f9e0: 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ne );.  asser
f9f0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
fa00: 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65  _LT || op==OP_Ge
fa10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
fa20: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c  xpr->op!=TK_LE |
fa30: 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  | op==OP_Gt );. 
fa40: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
fa50: 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d  op!=TK_GT || op=
fa60: 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Le );.  asse
fa70: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
fa80: 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GE || op==OP_L
fa90: 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  t );..  switch( 
faa0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
fab0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
fac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fad0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
fae0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
faf0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
fb00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fb10: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
fb20: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
fb30: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
fb40: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
fb50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
fb60: 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
fb70: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
fb80: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
fb90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fba0: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
fbb0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
fbc0: 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29  d2, !jumpIfNull)
fbd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
fbe0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
fbf0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
fc00: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
fc10: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
fc20: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
fc30: 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
fc40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fc50: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
fc60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
fc70: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
fc80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
fc90: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
fca0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
fcb0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fcc0: 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
fcd0: 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
fce0: 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
fcf0: 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
fd00: 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
fd10: 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _EQ: {.      sql
fd20: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
fd30: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
fd40: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
fd50: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
fd60: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
fd70: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
fd80: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
fd90: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
fda0: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73  >pRight, op, des
fdb0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
fdc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fdd0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
fde0: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
fdf0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
fe00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fe10: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
fe20: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
fe30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fe40: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
fe50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
fe60: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
fe70: 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
fe80: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
fe90: 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45  sion is "x BETWE
fea0: 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20  EN y AND z". It 
feb0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
fec0: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
fed0: 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20    ** 1 IF (x >= 
fee0: 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20  y) GOTO 3.      
fef0: 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e  ** 2 GOTO <dest>
ff00: 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28  .      ** 3 IF (
ff10: 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73  x > z) GOTO <des
ff20: 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t>.      */.    
ff30: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
ff40: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
ff50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
ff60: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
ff70: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
ff80: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
ff90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ffa0: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
ffb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ffc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ffd0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
ffe0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
fff0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
10000 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
10010 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10020 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
10030 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
10040 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
10050 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b  ht, OP_Ge, addr+
10060 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  3, !jumpIfNull);
10070 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
10080 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
10090 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
100a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
100b0 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
100c0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52   dest);.      pR
100d0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
100e0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
100f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10100 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10110 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
10120 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
10130 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
10140 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75   OP_Gt, dest, ju
10150 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
10160 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10170 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
10180 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10190 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
101a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
101b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
101c0 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  IfNot, jumpIfNul
101d0 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
101e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
101f0 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66  .  pParse->ckOff
10200 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b 0a  set = ckOffset;.
10210 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
10220 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
10230 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
10240 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
10250 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
10260 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
10270 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
10280 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
10290 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
102a0 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ay..*/.int sqlit
102b0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
102c0 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
102d0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
102e0 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pA==0 ){.    r
102f0 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d  eturn pB==0;.  }
10300 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29  else if( pB==0 )
10310 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
10320 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
10330 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
10340 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e  n 0;.  if( (pA->
10350 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
10360 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73  nct)!=(pB->flags
10370 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20   & EP_Distinct) 
10380 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10390 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
103a0 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
103b0 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65   pB->pLeft) ) re
103c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
103d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
103e0 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
103f0 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75  ->pRight) ) retu
10400 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
10410 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28  pList ){.    if(
10420 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20   pB->pList==0 ) 
10430 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
10440 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  ( pA->pList->nEx
10450 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e  pr!=pB->pList->n
10460 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b  Expr ) return 0;
10470 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10480 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
10490 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
104a0 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
104b0 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d  mpare(pA->pList-
104c0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d  >a[i].pExpr, pB-
104d0 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
104e0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
104f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
10500 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
10510 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pB->pList ){.
10520 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10530 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c  }.  if( pA->pSel
10540 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65  ect || pB->pSele
10550 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ct ) return 0;. 
10560 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21   if( pA->iTable!
10570 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70  =pB->iTable || p
10580 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
10590 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
105a0 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f   0;.  if( pA->to
105b0 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28  ken.z ){.    if(
105c0 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20   pB->token.z==0 
105d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
105e0 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21  if( pB->token.n!
105f0 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72  =pA->token.n ) r
10600 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
10610 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
10620 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42  (pA->token.z, pB
10630 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74  ->token.z, pB->t
10640 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74  oken.n)!=0 ) ret
10650 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
10660 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 1;.}.../*.**
10670 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
10680 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
10690 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
106a0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
106b0 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
106c0 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
106d0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
106e0 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
106f0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
10700 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
10710 6c 75 6d 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49  lumn(AggInfo *pI
10720 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
10730 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61   i = sqlite3Arra
10740 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a  yAllocate((void*
10750 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 20  *)&pInfo->aCol, 
10760 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43  sizeof(pInfo->aC
10770 6f 6c 5b 30 5d 29 2c 20 33 29 3b 0a 20 20 69 66  ol[0]), 3);.  if
10780 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( i<0 ){.    ret
10790 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  urn -1;.  }.  re
107a0 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f  turn i;.}    ../
107b0 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
107c0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41  lement to the pA
107d0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20  ggInfo->aFunc[] 
107e0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74  array.  Return t
107f0 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74  he index of.** t
10800 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20  he new element. 
10810 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
10820 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c  ve number if mal
10830 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  loc fails..*/.st
10840 61 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49  atic int addAggI
10850 6e 66 6f 46 75 6e 63 28 41 67 67 49 6e 66 6f 20  nfoFunc(AggInfo 
10860 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
10870 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41  ;.  i = sqlite3A
10880 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f  rrayAllocate((vo
10890 69 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e 61 46 75  id**)&pInfo->aFu
108a0 6e 63 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  nc, sizeof(pInfo
108b0 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 20 32 29 3b  ->aFunc[0]), 2);
108c0 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
108d0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
108e0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
108f0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
10900 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
10910 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75 73  alkExprTree() us
10920 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
10930 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41  .** sqlite3ExprA
10940 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
10950 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
10960 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
10970 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
10980 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
10990 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
109a0 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73  routine analyzes
109b0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
109c0 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72  unction at pExpr
109d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
109e0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
109f0 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
10a00 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
10a10 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
10a20 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f  t *pNC = (NameCo
10a30 6e 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20  ntext *)pArg;.  
10a40 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
10a50 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53  pNC->pParse;.  S
10a60 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
10a70 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
10a80 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  ;.  AggInfo *pAg
10a90 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67  gInfo = pNC->pAg
10aa0 67 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69  gInfo;.  ..  swi
10ab0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
10ac0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
10ad0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
10ae0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10af0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69   the column is i
10b00 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62  n one of the tab
10b10 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a  les in the FROM.
10b20 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20        ** clause 
10b30 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
10b40 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
10b50 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
10b60 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
10b70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
10b80 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
10b90 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
10ba0 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
10bb0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
10bc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
10bd0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
10be0 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20   *pCol;.        
10bf0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
10c00 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
10c10 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
10c20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
10c30 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
10c40 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
10c50 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
10c60 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
10c70 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
10c80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
10c90 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
10ca0 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
10cb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
10cc0 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
10cd0 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
10ce0 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
10cf0 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
10d00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
10d10 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
10d20 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
10d30 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
10d40 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
10d50 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
10d60 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
10d70 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
10d80 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 2c 20 70  >nColumn; i++, p
10d90 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
10da0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
10db0 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
10dc0 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
10dd0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
10de0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
10df0 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
10e00 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
10e10 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
10e20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
10e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10e40 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43   i>=pAggInfo->nC
10e50 6f 6c 75 6d 6e 20 26 26 20 28 69 20 3d 20 61 64  olumn && (i = ad
10e60 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
10e70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29 7b 0a  AggInfo))>=0 ){.
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
10e90 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
10ea0 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
10eb0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
10ec0 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
10ed0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
10ee0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
10ef0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
10f00 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
10f10 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50   pCol->iMem = pP
10f20 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
10f30 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
10f40 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
10f50 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
10f60 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
10f70 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
10f80 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
10f90 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
10fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10fb0 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
10fc0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
10fd0 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
10fe0 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11000 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
11010 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
11020 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
11030 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
11040 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
11050 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
11060 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
11070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11080 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
11090 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
110b0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
110c0 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
110d0 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
110e0 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
110f0 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
11100 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
11110 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
11130 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
11140 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
11150 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
111a0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
111b0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
111c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
111d0 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
111e0 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
111f0 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
11200 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
11210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
11220 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
11230 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
11240 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
11250 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
11260 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
11270 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
11280 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
11290 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
112a0 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
112b0 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
112c0 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
112d0 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
112e0 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
112f0 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
11300 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
11310 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
11320 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
11330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11340 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
11350 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
11360 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
11370 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43  r->op = TK_AGG_C
11380 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
11390 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
113a0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
113b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
113c0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
113d0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
113e0 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
113f0 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
11400 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
11410 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
11420 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
11430 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
11440 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
11450 20 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e      /* The pNC->
11460 6e 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63  nDepth==0 test c
11470 61 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20  auses aggregate 
11480 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62  functions in sub
11490 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a  queries.      **
114a0 20 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a   to be ignored *
114b0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d  /.      if( pNC-
114c0 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20  >nDepth==0 ){.  
114d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
114e0 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
114f0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
11500 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
11510 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
11520 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
11530 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
11540 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
11550 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
11560 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
11570 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
11580 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
11590 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
115a0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
115b0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
115c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
115d0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
115e0 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
115f0 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
11600 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11610 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11630 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
11640 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  >nFunc ){.      
11650 20 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20      /* pExpr is 
11660 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20  original.  Make 
11670 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
11680 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
11690 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
116a0 20 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d          u8 enc =
116b0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
116c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20  ;.          i = 
116d0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70  addAggInfoFunc(p
116e0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
116f0 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a      if( i>=0 ){.
11700 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
11710 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
11720 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
11730 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
11740 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
11750 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
11760 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
11770 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
11780 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20   pItem->pFunc = 
11790 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
117a0 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
117d0 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
117e0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
117f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
11800 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
11810 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e  t->nExpr : 0, en
11820 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
11830 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c     if( pExpr->fl
11840 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
11850 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
11860 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69     pItem->iDisti
11870 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
11880 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ab++;.          
11890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
118a0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
118b0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
118c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
118d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
118e0 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  }.        /* Mak
118f0 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f  e pExpr point to
11900 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
11910 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
11920 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  [] entry.       
11930 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70   */.        pExp
11940 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
11950 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67       pExpr->pAgg
11960 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b  Info = pAggInfo;
11970 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11980 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
11990 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72  .  }..  /* Recur
119a0 73 69 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71  sively walk subq
119b0 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66  ueries looking f
119c0 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  or TK_COLUMN nod
119d0 65 73 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a  es that need.  *
119e0 2a 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20  * to be changed 
119f0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
11a00 2e 20 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74  .  But increment
11a10 20 6e 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a   nDepth so that.
11a20 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43    ** TK_AGG_FUNC
11a30 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75  TION nodes in su
11a40 62 71 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65  bqueries will be
11a50 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
11a60 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53  .  if( pExpr->pS
11a70 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43  elect ){.    pNC
11a80 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20  ->nDepth++;.    
11a90 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70  walkSelectExpr(p
11aa0 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61  Expr->pSelect, a
11ab0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c  nalyzeAggregate,
11ac0 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e   pNC);.    pNC->
11ad0 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20  nDepth--;.  }.  
11ae0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11af0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67  ** Analyze the g
11b00 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
11b10 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
11b20 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
11b30 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
11b40 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
11b50 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
11b60 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
11b70 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20   array..** Make 
11b80 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  additional entri
11b90 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  es to the pParse
11ba0 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
11bb0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
11bc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11bd0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
11be0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
11bf0 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
11c00 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
11c10 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  by sqlite3ExprRe
11c20 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a  solveNames()..**
11c30 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72  .** If errors ar
11c40 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e  e seen, leave an
11c50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
11c60 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65  n zErrMsg and re
11c70 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
11c80 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
11c90 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
11ca0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
11cb0 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
11cc0 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
11cd0 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70  {.  int nErr = p
11ce0 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72  NC->pParse->nErr
11cf0 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
11d00 28 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41  (pExpr, analyzeA
11d10 67 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a  ggregate, pNC);.
11d20 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50    return pNC->pP
11d30 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72  arse->nErr - nEr
11d40 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  r;.}../*.** Call
11d50 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
11d60 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20  yzeAggregates() 
11d70 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
11d80 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78  sion in an.** ex
11d90 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
11da0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
11db0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
11dc0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
11dd0 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61  s found, the ana
11de0 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f  lysis is cut sho
11df0 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rt..*/.int sqlit
11e00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
11e10 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
11e20 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
11e30 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
11e40 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11e50 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
11e60 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
11e70 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
11e80 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
11e90 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72  ist->a, i=0; nEr
11ea0 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d  r==0 && i<pList-
11eb0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
11ec0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72  em++){.      nEr
11ed0 72 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r += sqlite3Expr
11ee0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
11ef0 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
11f00 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
11f10 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d    return nErr;.}
11f20 0a                                               .