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

Artifact 0546cc60f08c426d96092dea0789d085aed3580e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 32 36 38 20 32 30 30 36 2f 30 38 2f 32 34 20  .268 2006/08/24 
0220: 31 35 3a 31 38 3a 32 35 20 64 72 68 20 45 78 70  15:18:25 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 6f 72 6b 73  ;.}../*.** Works
1a00: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70   like sqlite3Exp
1a10: 72 28 29 20 62 75 74 20 66 72 65 65 73 20 69 74  r() but frees it
1a20: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
1a30: 68 74 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20  ht arguments.** 
1a40: 69 66 20 69 74 20 66 61 69 6c 73 20 64 75 65 20  if it fails due 
1a50: 74 6f 20 61 20 6d 61 6c 6c 6f 63 20 70 72 6f 62  to a malloc prob
1a60: 6c 65 6d 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  lem..*/.Expr *sq
1a70: 6c 69 74 65 33 45 78 70 72 4f 72 46 72 65 65 28  lite3ExprOrFree(
1a80: 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c  int op, Expr *pL
1a90: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1aa0: 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a  t, const Token *
1ab0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
1ac0: 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
1ad0: 78 70 72 28 6f 70 2c 20 70 4c 65 66 74 2c 20 70  xpr(op, pLeft, p
1ae0: 52 69 67 68 74 2c 20 70 54 6f 6b 65 6e 29 3b 0a  Right, pToken);.
1af0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1b10: 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20  Delete(pLeft);. 
1b20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1b30: 6c 65 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20  lete(pRight);.  
1b40: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
1b50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  .}../*.** When d
1b60: 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61  oing a nested pa
1b70: 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63  rse, you can inc
1b80: 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  lude terms in an
1b90: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
1ba0: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
1bb0: 69 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e  is:   #0 #1 #2 .
1bc0: 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  ..  These terms 
1bd0: 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74  refer to element
1be0: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  s.** on the stac
1bf0: 6b 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74  k.  "#0" means t
1c00: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
1c10: 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61  ack..** "#1" mea
1c20: 6e 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e  ns the next down
1c30: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
1c40: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
1c50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c60: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1c70: 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c  e parser to deal
1c80: 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73   with on of thos
1c90: 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69  e terms..** It i
1ca0: 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72  mmediately gener
1cb0: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f  ates code to sto
1cc0: 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
1cd0: 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  a memory locatio
1ce0: 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  n..** The return
1cf0: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
1d00: 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74  that will code t
1d10: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1d20: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74  lue from.** that
1d30: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1d40: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45   as needed..*/.E
1d50: 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69  xpr *sqlite3Regi
1d60: 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20 2a  sterExpr(Parse *
1d70: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1d80: 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a  Token){.  Vdbe *
1d90: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1da0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  e;.  Expr *p;.  
1db0: 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28  int depth;.  if(
1dc0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
1dd0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1de0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1df0: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
1e00: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70  syntax error", p
1e10: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  Token);.    retu
1e20: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1e30: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
1e40: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
1e50: 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c 20  pr(TK_REGISTER, 
1e60: 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  0, 0, pToken);. 
1e70: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
1e80: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d   return 0;  /* M
1e90: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
1ea0: 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61 74    }.  depth = at
1eb0: 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b 65  oi((char*)&pToke
1ec0: 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d 3e 69  n->z[1]);.  p->i
1ed0: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
1ee0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nMem++;.  sqlite
1ef0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1f00: 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30 29 3b  _Dup, depth, 0);
1f10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1f20: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
1f30: 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c 20 31  re, p->iTable, 1
1f40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
1f50: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f  ../*.** Join two
1f60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69   expressions usi
1f70: 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ng an AND operat
1f80: 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65  or.  If either e
1f90: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
1fa0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20  NULL, then just 
1fb0: 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72  return the other
1fc0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
1fd0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
1fe0: 72 41 6e 64 28 45 78 70 72 20 2a 70 4c 65 66 74  rAnd(Expr *pLeft
1ff0: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
2000: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
2010: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
2020: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
2030: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
2040: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
2050: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2060: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
2070: 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20  (TK_AND, pLeft, 
2080: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a  pRight, 0);.  }.
2090: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
20a0: 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64   Expr.span field
20b0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
20c0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e  pression to span
20d0: 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74   all.** text bet
20e0: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
20f0: 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f  en tokens..*/.vo
2100: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  id sqlite3ExprSp
2110: 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  an(Expr *pExpr, 
2120: 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f  Token *pLeft, To
2130: 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  ken *pRight){.  
2140: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d  assert( pRight!=
2150: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2160: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  Left!=0 );.  if(
2170: 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46   !sqlite3MallocF
2180: 61 69 6c 65 64 28 29 20 26 26 20 70 52 69 67 68  ailed() && pRigh
2190: 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a  t->z && pLeft->z
21a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21b0: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c  pLeft->dyn==0 ||
21c0: 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d   pLeft->z[pLeft-
21d0: 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  >n]==0 );.    if
21e0: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
21f0: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
2200: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
2210: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
2220: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
2230: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
2240: 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e  t->n + (pRight->
2250: 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  z - pLeft->z);. 
2260: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2270: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
2280: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
2290: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
22a0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
22b0: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
22c0: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
22d0: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
22e0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
22f0: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78  3ExprFunction(Ex
2300: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  prList *pList, T
2310: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
2320: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 61   Expr *pNew;.  a
2330: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
2340: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
2350: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
2360: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
2370: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
2380: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2390: 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76  te(pList); /* Av
23a0: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
23b0: 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  ry when malloc f
23c0: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
23d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
23e0: 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49  ->op = TK_FUNCTI
23f0: 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  ON;.  pNew->pLis
2400: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73  t = pList;.  ass
2410: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
2420: 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 74  ==0 );.  pNew->t
2430: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
2440: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
2450: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65  New->token;.  re
2460: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2470: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2480: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2490: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
24a0: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
24b0: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
24c0: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
24d0: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
24e0: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
24f0: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
2500: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
2510: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
2520: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
2530: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
2540: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
2550: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
2560: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
2570: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
2580: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
2590: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
25a0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
25b0: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
25c0: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
25d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
25e0: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
25f0: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
2600: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
2610: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
2620: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
2630: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
2640: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
2650: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
2660: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2670: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
2680: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2690: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
26a0: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
26b0: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
26c0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
26d0: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
26e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
26f0: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
2700: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
2710: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
2720: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
2730: 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  en;.  if( pExpr=
2740: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
2750: 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e  Token = &pExpr->
2760: 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  token;.  assert(
2770: 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b   pToken->n>=1 );
2780: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2790: 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73  n->z!=0 );.  ass
27a0: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30  ert( pToken->z[0
27b0: 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  ]!=0 );.  if( pT
27c0: 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20  oken->n==1 ){.  
27d0: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
27e0: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
27f0: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
2800: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2810: 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  */.    pExpr->iT
2820: 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  able = ++pParse-
2830: 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69  >nVar;.  }else i
2840: 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d  f( pToken->z[0]=
2850: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ='?' ){.    /* W
2860: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
2870: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
2880: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
2890: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
28a0: 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68   ** use it as th
28b0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
28c0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r */.    int i;.
28d0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
28e0: 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63 68  e = i = atoi((ch
28f0: 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31  ar*)&pToken->z[1
2900: 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20  ]);.    if( i<1 
2910: 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  || i>SQLITE_MAX_
2920: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
2930: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2940: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2950: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
2960: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
2970: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
2980: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2990: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
29a0: 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BER);.    }.    
29b0: 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56  if( i>pParse->nV
29c0: 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  ar ){.      pPar
29d0: 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20  se->nVar = i;.  
29e0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
29f0: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66   /* Wildcards of
2a00: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
2a10: 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65 75   or "$aaa".  Reu
2a20: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
2a30: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  able.    ** numb
2a40: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
2a50: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
2a60: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
2a70: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
2a80: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
2a90: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
2aa0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
2ab0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
2ac0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e   */.    int i, n
2ad0: 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e  ;.    n = pToken
2ae0: 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ->n;.    for(i=0
2af0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72  ; i<pParse->nVar
2b00: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
2b10: 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
2b20: 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61 72    if( (pE = pPar
2b30: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d  se->apVarExpr[i]
2b40: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )!=0.          &
2b50: 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e  & pE->token.n==n
2b60: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65  .          && me
2b70: 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a  mcmp(pE->token.z
2b80: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d  , pToken->z, n)=
2b90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
2ba0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  xpr->iTable = pE
2bb0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
2bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2be0: 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  >=pParse->nVarEx
2bf0: 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  pr ){.      pExp
2c00: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50  r->iTable = ++pP
2c10: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20  arse->nVar;.    
2c20: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
2c30: 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e  arExpr>=pParse->
2c40: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20  nVarExprAlloc-1 
2c50: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
2c60: 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63  e->nVarExprAlloc
2c70: 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72   += pParse->nVar
2c80: 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a  ExprAlloc + 10;.
2c90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 65          sqliteRe
2ca0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f 69  allocOrFree((voi
2cb0: 64 2a 2a 29 26 70 50 61 72 73 65 2d 3e 61 70 56  d**)&pParse->apV
2cc0: 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  arExpr,.        
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ce0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
2cf0: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72  lloc*sizeof(pPar
2d00: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d  se->apVarExpr[0]
2d10: 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ) );.      }.   
2d20: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4d     if( !sqlite3M
2d30: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
2d40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d50: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
2d60: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr!=0 );.       
2d70: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
2d80: 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  pr[pParse->nVarE
2d90: 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a  xpr++] = pExpr;.
2da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2db0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75  } .}../*.** Recu
2dc0: 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61  rsively delete a
2dd0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2de0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2df0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70  e3ExprDelete(Exp
2e00: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
2e10: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
2e20: 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20  ( p->span.dyn ) 
2e30: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
2e40: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20  *)p->span.z);.  
2e50: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  if( p->token.dyn
2e60: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
2e70: 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  har*)p->token.z)
2e80: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
2e90: 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b  elete(p->pLeft);
2ea0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
2eb0: 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b  lete(p->pRight);
2ec0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2ed0: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73  stDelete(p->pLis
2ee0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  t);.  sqlite3Sel
2ef0: 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65  ectDelete(p->pSe
2f00: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
2f10: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
2f20: 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 20   The Expr.token 
2f30: 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20 61  field might be a
2f40: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
2f50: 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e 0a  that is quoted..
2f60: 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76 65  ** If so, remove
2f70: 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20 6d   the quotation m
2f80: 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arks..*/.void sq
2f90: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
2fa0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
2fb0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
2fc0: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
2fd0: 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ed) ){.    retur
2fe0: 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65 74  n;.  }.  ExprSet
2ff0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 44  Property(p, EP_D
3000: 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28 20  equoted);.  if( 
3010: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20  p->token.dyn==0 
3020: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  ){.    sqlite3To
3030: 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74 6f 6b 65  kenCopy(&p->toke
3040: 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  n, &p->token);. 
3050: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
3060: 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ote((char*)p->to
3070: 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ken.z);.}.../*.*
3080: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3090: 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65  group of routine
30a0: 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69  s make deep copi
30b0: 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  es of expression
30c0: 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s,.** expression
30d0: 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73   lists, ID lists
30e0: 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61  , and select sta
30f0: 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f  tements.  The co
3100: 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64  pies can.** be d
3110: 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67  eleted (by being
3120: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72   passed to their
3130: 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44   respective ...D
3140: 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73  elete() routines
3150: 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66  ).** without eff
3160: 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  ecting the origi
3170: 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nals..**.** The 
3180: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
3190: 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20   ID, and source 
31a0: 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20  lists return by 
31b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
31c0: 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33  up(),.** sqlite3
31d0: 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64  IdListDup(), and
31e0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
31f0: 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20  up() can not be 
3200: 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64  further expanded
3210: 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65   .** by subseque
3220: 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
3230: 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20  te*ListAppend() 
3240: 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20  routines..**.** 
3250: 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20  Any tables that 
3260: 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68  the SrcList migh
3270: 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e  t point to are n
3280: 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a  ot duplicated..*
3290: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
32a0: 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b  xprDup(Expr *p){
32b0: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
32c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
32d0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
32e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
32f0: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
3300: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3310: 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79  turn 0;.  memcpy
3320: 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66  (pNew, p, sizeof
3330: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20  (*pNew));.  if( 
3340: 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b  p->token.z!=0 ){
3350: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
3360: 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  .z = (u8*)sqlite
3370: 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70  StrNDup((char*)p
3380: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f  ->token.z, p->to
3390: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77  ken.n);.    pNew
33a0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b  ->token.dyn = 1;
33b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
33c0: 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65  sert( pNew->toke
33d0: 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  n.z==0 );.  }.  
33e0: 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  pNew->span.z = 0
33f0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20  ;.  pNew->pLeft 
3400: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3410: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e  (p->pLeft);.  pN
3420: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
3430: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
3440: 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  Right);.  pNew->
3450: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
3460: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c  xprListDup(p->pL
3470: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
3480: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
3490: 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c  electDup(p->pSel
34a0: 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 54  ect);.  pNew->pT
34b0: 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20  ab = p->pTab;.  
34c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76  return pNew;.}.v
34d0: 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e  oid sqlite3Token
34e0: 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c  Copy(Token *pTo,
34f0: 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a   Token *pFrom){.
3500: 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29    if( pTo->dyn )
3510: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
3520: 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66  r*)pTo->z);.  if
3530: 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20  ( pFrom->z ){.  
3540: 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d    pTo->n = pFrom
3550: 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  ->n;.    pTo->z 
3560: 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 53 74 72  = (u8*)sqliteStr
3570: 4e 44 75 70 28 28 63 68 61 72 2a 29 70 46 72 6f  NDup((char*)pFro
3580: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
3590: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
35a0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
35b0: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
35c0: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
35d0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45  te3ExprListDup(E
35e0: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
35f0: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
3600: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
3610: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70  _item *pItem, *p
3620: 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69  OldItem;.  int i
3630: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3640: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3650: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
3660: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
3670: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3680: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3690: 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d  w->nExpr = pNew-
36a0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78  >nAlloc = p->nEx
36b0: 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  pr;.  pNew->a = 
36c0: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61  pItem = sqliteMa
36d0: 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73  lloc( p->nExpr*s
36e0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
36f0: 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30  ;.  if( pItem==0
3700: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
3710: 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65  ee(pNew);.    re
3720: 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70  turn 0;.  } .  p
3730: 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a  OldItem = p->a;.
3740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3750: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
3760: 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29  m++, pOldItem++)
3770: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
3780: 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b  Expr, *pOldExpr;
3790: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
37a0: 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73  r = pNewExpr = s
37b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
37c0: 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65  ldExpr = pOldIte
37d0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
37e0: 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  f( pOldExpr->spa
37f0: 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78  n.z!=0 && pNewEx
3800: 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  pr ){.      /* A
3810: 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70  lways make a cop
3820: 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f  y of the span fo
3830: 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72  r top-level expr
3840: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20  essions in the. 
3850: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
3860: 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f  on list.  The lo
3870: 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72  gic in SELECT pr
3880: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65  ocessing that de
3890: 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a  termines.      *
38a0: 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  * the names of c
38b0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
38c0: 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74  sult set needs t
38d0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
38e0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
38f0: 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45  TokenCopy(&pNewE
3900: 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64  xpr->span, &pOld
3910: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
3920: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
3930: 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e  NewExpr==0 || pN
3940: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ewExpr->span.z!=
3950: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  0 .            |
3960: 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  | pOldExpr->span
3970: 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  .z==0.          
3980: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c    || sqlite3Mall
3990: 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20  ocFailed() );.  
39a0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
39b0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
39c0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
39d0: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
39e0: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
39f0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
3a00: 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70  pItem->isAgg = p
3a10: 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a  OldItem->isAgg;.
3a20: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
3a30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
3a40: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
3a50: 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69   If cursors, tri
3a60: 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64  ggers, views and
3a70: 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20   subqueries are 
3a80: 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  all omitted from
3a90: 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74  .** the build, t
3aa0: 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hen none of the 
3ab0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
3ac0: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a  es, except for .
3ad0: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
3ae0: 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61  Dup(), can be ca
3af0: 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c  lled. sqlite3Sel
3b00: 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65  ectDup() is some
3b10: 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  times.** called 
3b20: 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75  with a NULL argu
3b30: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  ment..*/.#if !de
3b40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3b50: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
3b60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3b70: 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21  TRIGGER) \. || !
3b80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3b90: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72  MIT_SUBQUERY).Sr
3ba0: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
3bb0: 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74  cListDup(SrcList
3bc0: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
3bd0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
3be0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
3bf0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
3c00: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
3c10: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
3c20: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
3c30: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
3c40: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
3c50: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3c60: 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20  cRaw( nByte );. 
3c70: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
3c80: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
3c90: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
3ca0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
3cb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3cc0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
3cd0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3ce0: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
3cf0: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
3d00: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3d10: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
3d20: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
3d30: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
3d40: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
3d50: 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ase = sqliteStrD
3d60: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  up(pOldItem->zDa
3d70: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
3d80: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
3d90: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
3da0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
3db0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
3dc0: 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  as = sqliteStrDu
3dd0: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  p(pOldItem->zAli
3de0: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
3df0: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
3e00: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
3e10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3e20: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
3e30: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
3e40: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f 70   pNewItem->isPop
3e50: 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74 65  ulated = pOldIte
3e60: 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b 0a  m->isPopulated;.
3e70: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
3e80: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
3e90: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
3ea0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
3eb0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
3ec0: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
3ed0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
3ee0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
3ef0: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
3f00: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3f10: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
3f20: 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  prDup(pOldItem->
3f30: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
3f40: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
3f50: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f  ite3IdListDup(pO
3f60: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
3f70: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
3f80: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
3f90: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
3fa0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3fb0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
3fc0: 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74  IdListDup(IdList
3fd0: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
3fe0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
3ff0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
4000: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
4010: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
4020: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
4030: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4040: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4050: 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e  w->nId = pNew->n
4060: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a  Alloc = p->nId;.
4070: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
4080: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e  teMallocRaw( p->
4090: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
40a0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
40b0: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
40c0: 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b  qliteFree(pNew);
40d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
40e0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
40f0: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
4100: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
4110: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
4120: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
4130: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
4140: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
4150: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
4160: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
4170: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
4180: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
4190: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
41a0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
41b0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
41c0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
41d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
41e0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
41f0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
4200: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4210: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
4220: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
4230: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
4240: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
4250: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  rn 0;.  pNew->is
4260: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
4270: 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77  Distinct;.  pNew
4280: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
4290: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
42a0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  >pEList);.  pNew
42b0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
42c0: 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53  SrcListDup(p->pS
42d0: 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  rc);.  pNew->pWh
42e0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
42f0: 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b  rDup(p->pWhere);
4300: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
4310: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
4320: 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75 70  istDup(p->pGroup
4330: 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  By);.  pNew->pHa
4340: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
4350: 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e 67  prDup(p->pHaving
4360: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
4370: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
4380: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72 64  rListDup(p->pOrd
4390: 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  erBy);.  pNew->o
43a0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65  p = p->op;.  pNe
43b0: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69  w->pPrior = sqli
43c0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  te3SelectDup(p->
43d0: 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d  pPrior);.  pNew-
43e0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
43f0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69 6d  3ExprDup(p->pLim
4400: 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  it);.  pNew->pOf
4410: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
4420: 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65 74  prDup(p->pOffset
4430: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
4440: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
4450: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
4460: 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64  pNew->isResolved
4470: 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64   = p->isResolved
4480: 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20  ;.  pNew->isAgg 
4490: 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 4e  = p->isAgg;.  pN
44a0: 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 30  ew->usesEphm = 0
44b0: 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c 6c  ;.  pNew->disall
44c0: 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  owOrderBy = 0;. 
44d0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
44e0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
44f0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
4500: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
4510: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
4520: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
4530: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
4540: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4550: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
4560: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4570: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61  (Select *p){.  a
4580: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
4590: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
45a0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
45b0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
45c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
45d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
45e0: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
45f0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
4600: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
4610: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
4620: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
4630: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
4640: 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a  ppend(ExprList *
4650: 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78  pList, Expr *pEx
4660: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
4670: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
4680: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
4690: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
46a0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
46b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
46c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
46d0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
46e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
46f0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
4700: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
4710: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
4720: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
4730: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4740: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
4750: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
4760: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
4770: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
4780: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
4790: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
47a0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
47b0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
47c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
47d0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c  t->a = a;.    pL
47e0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b  ist->nAlloc = n;
47f0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4800: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
4810: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
4820: 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  me ){.    struct
4830: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
4840: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
4850: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
4860: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
4870: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
4880: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
4890: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
48a0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
48b0: 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  (pName);.    pIt
48c0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
48d0: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
48e0: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
48f0: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
4900: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
4910: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
4920: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
4930: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
4940: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
4950: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
4960: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
4970: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
4980: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
4990: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
49a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
49b0: 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73  stDelete(ExprLis
49c0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
49d0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
49e0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
49f0: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
4a00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
4a10: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
4a20: 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78  0 || (pList->nEx
4a30: 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e  pr==0 && pList->
4a40: 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20  nAlloc==0) );.  
4a50: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
4a60: 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr<=pList->nAl
4a70: 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  loc );.  for(pIt
4a80: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
4a90: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
4aa0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
4ab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4ac0: 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45  Delete(pItem->pE
4ad0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
4ae0: 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Free(pItem->zNam
4af0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
4b00: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
4b10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
4b20: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  st);.}../*.** Wa
4b30: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
4b40: 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46 75   tree.  Call xFu
4b50: 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65  nc for each node
4b60: 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   visited..**.** 
4b70: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
4b80: 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74 65   from xFunc dete
4b90: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 74  rmines whether t
4ba0: 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e  he tree walk con
4bb0: 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61  tinues..** 0 mea
4bc0: 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b  ns continue walk
4bd0: 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20 31  ing the tree.  1
4be0: 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61   means do not wa
4bf0: 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f  lk children.** o
4c00: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  f the current no
4c10: 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  de but continue 
4c20: 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20 20  with siblings.  
4c30: 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a  2 means abandon.
4c40: 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  ** the tree walk
4c50: 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a   completely..**.
4c60: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
4c70: 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  lue from this ro
4c80: 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61 62  utine is 1 to ab
4c90: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
4ca0: 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20  alk.** and 0 to 
4cb0: 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
4cc0: 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72 6f  NOTICE:  This ro
4cd0: 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74 2a  utine does *not*
4ce0: 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73 75   descend into su
4cf0: 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61  bqueries..*/.sta
4d00: 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72  tic int walkExpr
4d10: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 2c  List(ExprList *,
4d20: 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c   int (*)(void *,
4d30: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29   Expr*), void *)
4d40: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  ;.static int wal
4d50: 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20 2a  kExprTree(Expr *
4d60: 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75  pExpr, int (*xFu
4d70: 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29  nc)(void*,Expr*)
4d80: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
4d90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
4da0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
4db0: 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75   0;.  rc = (*xFu
4dc0: 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72 29  nc)(pArg, pExpr)
4dd0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
4de0: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4df0: 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65  rTree(pExpr->pLe
4e00: 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ft, xFunc, pArg)
4e10: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
4e20: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
4e30: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  e(pExpr->pRight,
4e40: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
4e50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
4e60: 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  ( walkExprList(p
4e70: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75  Expr->pList, xFu
4e80: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
4e90: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
4ea0: 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn rc>1;.}../*.*
4eb0: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
4ec0: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
4ed0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69  expression in li
4ee0: 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st p..*/.static 
4ef0: 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  int walkExprList
4f00: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
4f10: 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20  t (*xFunc)(void 
4f20: 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  *, Expr*), void 
4f30: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b  *pArg){.  int i;
4f40: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
4f50: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
4f60: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
4f70: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  n 0;.  for(i=p->
4f80: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
4f90: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
4fa0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 77  em++){.    if( w
4fb0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74 65  alkExprTree(pIte
4fc0: 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c  m->pExpr, xFunc,
4fd0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4fe0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4ff0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  0;.}../*.** Call
5000: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
5010: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
5020: 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 70  sion in Select p
5030: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a  , not including.
5040: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
5050: 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20  hat are part of 
5060: 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 61  sub-selects in a
5070: 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ny FROM clause o
5080: 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f  r the LIMIT.** o
5090: 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73 73  r OFFSET express
50a0: 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ions...*/.static
50b0: 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74 45   int walkSelectE
50c0: 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  xpr(Select *p, i
50d0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
50e0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
50f0: 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45   *pArg){.  walkE
5100: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
5110: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  t, xFunc, pArg);
5120: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
5130: 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e 63  p->pWhere, xFunc
5140: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
5150: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
5160: 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  pBy, xFunc, pArg
5170: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  );.  walkExprTre
5180: 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46  e(p->pHaving, xF
5190: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
51a0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  lkExprList(p->pO
51b0: 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20 70  rderBy, xFunc, p
51c0: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
51d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
51e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
51f0: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
5200: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
5210: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20  e()..**.** pArg 
5220: 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
5230: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
5240: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74 65  r.  If we can te
5250: 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  ll by looking.**
5260: 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20 74   at pExpr that t
5270: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
5280: 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78 70  at contains pExp
5290: 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  r is not a const
52a0: 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
52b0: 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41 72  n, then set *pAr
52c0: 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  g to 0 and retur
52d0: 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  n 2 to abandon t
52e0: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
52f0: 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20 64   If pExpr does d
5300: 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c 69  oes not disquali
5310: 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
5320: 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20 63  n from being a c
5330: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20  onstant.** then 
5340: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  do nothing..**.*
5350: 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67 20  * After walking 
5360: 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c 20  the whole tree, 
5370: 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20  if no nodes are 
5380: 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71 75  found that disqu
5390: 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78 70  alify.** the exp
53a0: 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74  ression as const
53b0: 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73 73  ant, then we ass
53c0: 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ume the whole ex
53d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
53e0: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73 71  onstant.  See sq
53f0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
5400: 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  ant() for additi
5410: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5430: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
5440: 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  nt(void *pArg, E
5450: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
5460: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
5470: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
5480: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
5490: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
54a0: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
54b0: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
54c0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72  .    ** and *pAr
54d0: 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65  g==2 */.    case
54e0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
54f0: 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74 2a 29      if( *((int*)
5500: 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74 75 72  pArg)==2 ) retur
5510: 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  n 0;.      /* Fa
5520: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
5530: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
5540: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
5550: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
5560: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  T:.    case TK_A
5570: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
5580: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
5590: 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN:.#ifndef SQL
55a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
55b0: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
55c0: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
55d0: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
55e0: 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70  .      *((int*)p
55f0: 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  Arg) = 0;.      
5600: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63 61  return 2;.    ca
5610: 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20  se TK_IN:.      
5620: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
5630: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  ct ){.        *(
5640: 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b  (int*)pArg) = 0;
5650: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5660: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64  2;.      }.    d
5670: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
5680: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
5690: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
56a0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
56b0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
56c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
56d0: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
56e0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
56f0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
5700: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
5710: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
5720: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
5730: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
5740: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
5750: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
5760: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
5770: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
5780: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
5790: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
57a0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
57b0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
57c0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
57d0: 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74  ){.  int isConst
57e0: 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 1;.  walkExpr
57f0: 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65  Tree(p, exprNode
5800: 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43  IsConstant, &isC
5810: 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  onst);.  return 
5820: 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  isConst;.}../*.*
5830: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
5840: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
5850: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
5860: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
5870: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
5880: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
5890: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
58a0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
58b0: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
58c0: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
58d0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
58e0: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
58f0: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
5900: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
5910: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
5920: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
5930: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
5940: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
5950: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
5960: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
5970: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
5980: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
5990: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
59a0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
59b0: 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   2;.  walkExprTr
59c0: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
59d0: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
59e0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
59f0: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
5a00: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
5a10: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
5a20: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
5a30: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
5a40: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
5a50: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
5a60: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
5a70: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
5a80: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
5a90: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
5aa0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5ab0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
5ac0: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
5ad0: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
5ae0: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
5af0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
5b00: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
5b10: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
5b20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5b30: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
5b40: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
5b50: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
5b60: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
5b70: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
5b80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5b90: 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a 29  GetInt32((char*)
5ba0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
5bb0: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
5bc0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5bd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5be0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
5bf0: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
5c00: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
5c10: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
5c20: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
5c30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
5c40: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
5c50: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
5c60: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
5c70: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
5c80: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
5c90: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
5ca0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5cb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5cc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
5cd0: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
5ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
5cf0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
5d00: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
5d10: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
5d20: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
5d30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
5d40: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
5d50: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
5d60: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
5d70: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
5d80: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
5d90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5da0: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
5db0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
5dc0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5dd0: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
5de0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
5df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5e00: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
5e10: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
5e20: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
5e30: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
5e40: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
5e50: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
5e60: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
5e70: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
5e80: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
5e90: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
5ea0: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
5eb0: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
5ec0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
5ed0: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
5ee0: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
5ef0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
5f00: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
5f10: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
5f20: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
5f30: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
5f60: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
5f70: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
5f80: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
5f90: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5fa0: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
5fb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5fc0: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
5fd0: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
5fe0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
5ff0: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
6000: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
6010: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
6020: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
6030: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
6040: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
6050: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
6060: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
6070: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
6080: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
6090: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
60a0: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
60b0: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
60c0: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
60d0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
60e0: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
60f0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
6100: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
6110: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
6120: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
6130: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
6140: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
6150: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
6160: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
6170: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
6180: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
6190: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
61a0: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
61b0: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
61c0: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
61d0: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
61e0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
61f0: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
6200: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
6210: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
6220: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
6230: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
6240: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
6250: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
6260: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
6270: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
6280: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
6290: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
62a0: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
62b0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
62c0: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
62d0: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
62e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
62f0: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
6300: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6310: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
6320: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
6330: 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20  en *pDbToken,   
6340: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
6350: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
6360: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
6370: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
6380: 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a  pTableToken,  /*
6390: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
63a0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
63b0: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
63c0: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b  oken *pColumnTok
63d0: 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  en, /* Name of t
63e0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
63f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
6400: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
6410: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
6420: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
6430: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
6440: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
6450: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
6460: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
6470: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
6480: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
6490: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  b = 0;       /* 
64a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
64b0: 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69  base.  The "X" i
64c0: 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61  n X.Y.Z */.  cha
64d0: 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
64e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
64f0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22   table.  The "Y"
6500: 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a   in X.Y.Z or Y.Z
6510: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
6520: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
6530: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
6540: 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20  .  The "Z" */.  
6550: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
6560: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
6570: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
6580: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
6590: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
65a0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
65b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
65c0: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
65d0: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
65e0: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
65f0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
6600: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
6610: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
6620: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
6630: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
6640: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
6650: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
6660: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
6670: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
6680: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
6690: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
66a0: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
66b0: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
66c0: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
66d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
66e0: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
66f0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20   the list */..  
6700: 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54  assert( pColumnT
6710: 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54  oken && pColumnT
6720: 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68  oken->z ); /* Th
6730: 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e  e Z in X.Y.Z can
6740: 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  not be NULL */. 
6750: 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61   zDb = sqlite3Na
6760: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54  meFromToken(pDbT
6770: 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20  oken);.  zTab = 
6780: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6790: 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e  oken(pTableToken
67a0: 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69  );.  zCol = sqli
67b0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
67c0: 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a  (pColumnToken);.
67d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
67e0: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
67f0: 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61     goto lookupna
6800: 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 70  me_end;.  }..  p
6810: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d  Expr->iTable = -
6820: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20  1;.  while( pNC 
6830: 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  && cnt==0 ){.   
6840: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6850: 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
6860: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
6870: 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69  pSrcList;..    i
6880: 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
6890: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49       for(i=0, pI
68a0: 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b  tem=pSrcList->a;
68b0: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
68c0: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
68d0: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
68e0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  *pTab;.        i
68f0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
6900: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
6910: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
6920: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
6930: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
6940: 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b!=0 );.        
6950: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
6960: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
6970: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
6980: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6990: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
69a0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20         if( zTab 
69b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
69c0: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
69d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
69e0: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
69f0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
6a00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
6a10: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
6a20: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
6a30: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6a40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6a50: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
6a60: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
6a70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
6a80: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
6a90: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
6aa0: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
6ab0: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
6ac0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6ad0: 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71  if( zDb!=0 && sq
6ae0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
6af0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
6b00: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
6b10: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
6b20: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6b30: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
6b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6b50: 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b  if( 0==(cntTab++
6b60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
6b70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
6b80: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
6b90: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6ba0: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
6bb0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
6bc0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
6bd0: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
6be0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43       for(j=0, pC
6bf0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
6c00: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
6c10: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
6c20: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6c30: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
6c40: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
6c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
6c60: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
6c70: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
6c80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
6c90: 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
6ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  ;.            cn
6cb0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
6cc0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6cd0: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
6ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61  .            pMa
6cf0: 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20  tch = pItem;.   
6d00: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6d10: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
6d20: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
6d30: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
6d40: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
6d50: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
6d60: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
6d70: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
6d80: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
6d90: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
6da0: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
6db0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6dc0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
6dd0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
6de0: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
6df0: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
6e00: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
6e10: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
6e20: 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20  Coll,-1, 0);.   
6e30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
6e40: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
6e50: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
6e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
6e70: 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75   this match occu
6e80: 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74  rred in the left
6e90: 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75   table of a natu
6ea0: 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20  ral join,.      
6eb0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
6ec0: 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74  skip the right t
6ed0: 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20  able to avoid a 
6ee0: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
6ef0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
6f00: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
6f10: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
6f20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6f30: 20 20 20 20 20 20 20 69 66 28 20 28 70 55 73 69         if( (pUsi
6f40: 6e 67 20 3d 20 70 49 74 65 6d 2d 3e 70 55 73 69  ng = pItem->pUsi
6f50: 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ng)!=0 ){.      
6f60: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
6f70: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20  is match occurs 
6f80: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  on a column that
6f90: 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47   is in the USING
6fa0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
6fb0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f        ** of a jo
6fc0: 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65 61  in, skip the sea
6fd0: 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68 74  rch of the right
6fe0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
6ff0: 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  in.             
7000: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64   ** to avoid a d
7010: 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74  uplicate match t
7020: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
7030: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
7040: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
7050: 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e  k=0; k<pUsing->n
7060: 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; k++){.      
7070: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
7080: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73  lite3StrICmp(pUs
7090: 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c  ing->a[k].zName,
70a0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
70c0: 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Item++;.        
70d0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7100: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7130: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
7160: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7170: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
7180: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
7190: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
71a0: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
71b0: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20  n maybe .    ** 
71c0: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
71d0: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
71e0: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
71f0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
7200: 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21   zDb==0 && zTab!
7210: 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20  =0 && cnt==0 && 
7220: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
7230: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72  k!=0 ){.      Tr
7240: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69  iggerStack *pTri
7250: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
7260: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
7270: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
7280: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
7290: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
72a0: 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ewIdx != -1 && s
72b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e  qlite3StrICmp("n
72c0: 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ew", zTab) == 0 
72d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
72e0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
72f0: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
7300: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7310: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
7320: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
7330: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
7340: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
7350: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
7360: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
7370: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
7380: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
7390: 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , zTab)==0 ){.  
73a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
73b0: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
73c0: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
73d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
73e0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
73f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
7400: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
7410: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a  ->pTab;.      }.
7420: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
7430: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){ .        int 
7440: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f  iCol;.        Co
7450: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61  lumn *pCol = pTa
7460: 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  b->aCol;..      
7470: 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d 61    pExpr->pSchema
7480: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
7490: 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61 62  ;.        cntTab
74a0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ++;.        for(
74b0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20 70  iCol=0; iCol < p
74c0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
74d0: 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20  +, pCol++) {.   
74e0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
74f0: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
7500: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
7510: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
7520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
7530: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
7540: 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  ol].zColl;.     
7550: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
7560: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7570: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d  >iColumn = iCol=
7580: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
7590: 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  1 : iCol;.      
75a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
75b0: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
75c0: 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
75d0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
75e0: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71  Expr->pColl = sq
75f0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
7600: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
7610: 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20 20  oll,-1, 0);.    
7620: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
7630: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
7640: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7650: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7660: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7670: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
7680: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7690: 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20  T_TRIGGER) */.. 
76a0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72     /*.    ** Per
76b0: 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73  haps the name is
76c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
76d0: 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f  the ROWID.    */
76e0: 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  .    if( cnt==0 
76f0: 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20  && cntTab==1 && 
7700: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
7710: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  Col) ){.      cn
7720: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78  t = 1;.      pEx
7730: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  pr->iColumn = -1
7740: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61  ;.      pExpr->a
7750: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
7760: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
7770: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
7780: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
7790: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a  is of the form Z
77a0: 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59   (not Y.Z or X.Y
77b0: 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d  .Z) then the nam
77c0: 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74  e Z.    ** might
77d0: 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73   refer to an res
77e0: 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20  ult-set alias.  
77f0: 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
7800: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
7810: 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65      ** we are re
7820: 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e  solving names in
7830: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
7840: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
7850: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20  ng command:.    
7860: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
7870: 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52  LECT a+b AS x FR
7880: 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78  OM table WHERE x
7890: 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <10;.    **.    
78a0: 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65  ** In cases like
78b0: 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70   this, replace p
78c0: 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79  Expr with a copy
78d0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
78e0: 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66  on that.    ** f
78f0: 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20  orms the result 
7900: 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22  set entry ("a+b"
7910: 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29   in the example)
7920: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
7930: 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
7940: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78  Note that the ex
7950: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
7960: 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c  result set shoul
7970: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
7980: 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c  een.    ** resol
7990: 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20  ved by the time 
79a0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
79b0: 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20   is resolved..  
79c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
79d0: 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d  ==0 && (pEList =
79e0: 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30   pNC->pEList)!=0
79f0: 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20   && zTab==0 ){. 
7a00: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
7a10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
7a20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
7a30: 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d  r *zAs = pEList-
7a40: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
7a50: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
7a60: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
7a70: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
7a80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
7a90: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
7aa0: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
7ab0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
7ac0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
7ad0: 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20 20  = TK_AS;.       
7ae0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
7af0: 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
7b00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
7b10: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
7b20: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  EList->a[j].pExp
7b30: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e  r);.          cn
7b40: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
7b50: 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30   assert( zTab==0
7b60: 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20   && zDb==0 );.  
7b70: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f          goto loo
7b80: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a 20  kupname_end_2;. 
7b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7ba0: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20   .    }..    /* 
7bb0: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
7bc0: 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ext name context
7bd0: 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  .  The loop will
7be0: 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65   exit when eithe
7bf0: 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65  r.    ** we have
7c00: 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29   a match (cnt>0)
7c10: 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20   or when we run 
7c20: 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74  out of name cont
7c30: 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  exts..    */.   
7c40: 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20   if( cnt==0 ){. 
7c50: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
7c60: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
7c70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58  ..  /*.  ** If X
7c80: 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20   and Y are NULL 
7c90: 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20  (in other words 
7ca0: 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  if only the colu
7cb0: 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a  mn name Z is.  *
7cc0: 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20  * supplied) and 
7cd0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69  the value of Z i
7ce0: 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f  s enclosed in do
7cf0: 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65  uble-quotes, the
7d00: 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74  n.  ** Z is a st
7d10: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20  ring literal if 
7d20: 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  it doesn't match
7d30: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   any column name
7d40: 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a  s.  In that.  **
7d50: 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74   case, we need t
7d60: 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  o return right a
7d70: 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65  way and not make
7d80: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a   any changes to.
7d90: 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a    ** pExpr..  **
7da0: 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f  .  ** Because no
7db0: 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d   reference was m
7dc0: 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e  ade to outer con
7dd0: 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e  texts, the pNC->
7de0: 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73  nRef.  ** fields
7df0: 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64   are not changed
7e00: 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e   in any context.
7e10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d  .  */.  if( cnt=
7e20: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26  =0 && zTab==0 &&
7e30: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
7e40: 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  [0]=='"' ){.    
7e50: 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29  sqliteFree(zCol)
7e60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
7e70: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63    }..  /*.  ** c
7e80: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72  nt==0 means ther
7e90: 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e  e was not match.
7ea0: 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68    cnt>1 means th
7eb0: 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a  ere were two or.
7ec0: 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65    ** more matche
7ed0: 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
7ee0: 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72  we have an error
7ef0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
7f00: 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20  !=1 ){.    char 
7f10: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  *z = 0;.    char
7f20: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72   *zErr;.    zErr
7f30: 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20   = cnt==0 ? "no 
7f40: 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22  such column: %s"
7f50: 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f   : "ambiguous co
7f60: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b 0a  lumn name: %s";.
7f70: 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20      if( zDb ){. 
7f80: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
7f90: 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22  tring(&z, zDb, "
7fa0: 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  .", zTab, ".", z
7fb0: 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Col, (char*)0);.
7fc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
7fd0: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
7fe0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
7ff0: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
8000: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
8010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
8020: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
8030: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
8040: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8050: 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29  pParse, zErr, z)
8060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8070: 28 7a 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d  (z);.    pTopNC-
8080: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nErr++;.  }..  
8090: 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66  /* If a column f
80a0: 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70  rom a table in p
80b0: 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65 72  SrcList is refer
80c0: 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f  enced, then reco
80d0: 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63  rd.  ** this fac
80e0: 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73  t in the pSrcLis
80f0: 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69  t.a[].colUsed bi
8100: 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30  tmask.  Column 0
8110: 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74   causes.  ** bit
8120: 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43   0 to be set.  C
8130: 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74  olumn 1 sets bit
8140: 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74   1.  And so fort
8150: 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  h.  If the.  ** 
8160: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73  column number is
8170: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
8180: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
8190: 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a   in the bitmask.
81a0: 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68    ** then set th
81b0: 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74  e high-order bit
81c0: 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e   of the bitmask.
81d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
81e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  r->iColumn>=0 &&
81f0: 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20   pMatch!=0 ){.  
8200: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
8210: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  >iColumn;.    if
8220: 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ( n>=sizeof(Bitm
8230: 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20  ask)*8 ){.      
8240: 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61  n = sizeof(Bitma
8250: 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20  sk)*8-1;.    }. 
8260: 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63     assert( pMatc
8270: 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70  h->iCursor==pExp
8280: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
8290: 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64   pMatch->colUsed
82a0: 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c   |= 1<<n;.  }..l
82b0: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20  ookupname_end:. 
82c0: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64   /* Clean up and
82d0: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
82e0: 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b 0a  qliteFree(zDb);.
82f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
8300: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  b);.  sqlite3Exp
8310: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
8320: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
8330: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
8340: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
8350: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
8360: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
8370: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
8380: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f  = TK_COLUMN;.loo
8390: 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20  kupname_end_2:. 
83a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
83b0: 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  );.  if( cnt==1 
83c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
83d0: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  NC!=0 );.    sql
83e0: 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50 61  ite3AuthRead(pPa
83f0: 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43 2d  rse, pExpr, pNC-
8400: 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20  >pSrcList);.    
8410: 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21 70  if( pMatch && !p
8420: 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20 29  Match->pSelect )
8430: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  {.      pExpr->p
8440: 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54  Tab = pMatch->pT
8450: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ab;.    }.    /*
8460: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
8470: 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c  Ref value on all
8480: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66   name contexts f
8490: 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a  rom TopNC up to.
84a0: 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74      ** the point
84b0: 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20   where the name 
84c0: 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20  matched. */.    
84d0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61  for(;;){.      a
84e0: 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30  ssert( pTopNC!=0
84f0: 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43   );.      pTopNC
8500: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
8510: 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20  if( pTopNC==pNC 
8520: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
8530: 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e  TopNC = pTopNC->
8540: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
8550: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65   return 0;.  } e
8560: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
8570: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
8580: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8590: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
85a0: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
85b0: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
85c0: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
85d0: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
85e0: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
85f0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
8600: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
8610: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
8620: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
8630: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
8640: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
8650: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
8660: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
8670: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8680: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
8690: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
86a0: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
86b0: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
86c0: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
86d0: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
86e0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
86f0: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
8700: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
8710: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
8720: 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69  ResolverStep(voi
8730: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
8740: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
8750: 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
8760: 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a  eContext*)pArg;.
8770: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
8780: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
8790: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
87a0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
87b0: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
87c0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20  >pParse;..  if( 
87d0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
87e0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
87f0: 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20  olved) ) return 
8800: 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  1;.  ExprSetProp
8810: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
8820: 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65  esolved);.#ifnde
8830: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70  f NDEBUG.  if( p
8840: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20  NC->pSrcList && 
8850: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
8860: 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53  Alloc>0 ){.    S
8870: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
8880: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
8890: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
88a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d   for(i=0; i<pNC-
88b0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  >pSrcList->nSrc;
88c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
88d0: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
88e0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
88f0: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
8900: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
8910: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
8920: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
8930: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
8940: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
8950: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
8960: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
8970: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
8980: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
8990: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
89a0: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
89b0: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
89c0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
89d0: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
89e0: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
89f0: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
8a00: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
8a10: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
8a20: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
8a30: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
8a40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
8a50: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
8a60: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
8a70: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
8a80: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
8a90: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
8aa0: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
8ab0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
8ac0: 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  a column..    */
8ad0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
8ae0: 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   {.      lookupN
8af0: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
8b00: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
8b10: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
8b20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8b30: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
8b40: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
8b50: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
8b60: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
8b70: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
8b80: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
8b90: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
8ba0: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
8bb0: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
8bc0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f  Column;.      To
8bd0: 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20  ken *pTable;.   
8be0: 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20     Token *pDb;. 
8bf0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
8c00: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
8c10: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
8c20: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
8c30: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
8c40: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
8c50: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
8c60: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ID ){.        pD
8c70: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
8c80: 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e  Table = &pExpr->
8c90: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
8ca0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
8cb0: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  &pRight->token;.
8cc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8cd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
8ce0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
8cf0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  );.        pDb =
8d00: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
8d10: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
8d20: 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d  Table = &pRight-
8d30: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
8d40: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
8d50: 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74   &pRight->pRight
8d60: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
8d70: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
8d80: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
8d90: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
8da0: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
8db0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8dc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
8dd0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
8de0: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
8df0: 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
8e00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
8e10: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
8e20: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
8e30: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
8e40: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
8e50: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
8e60: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
8e70: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
8e80: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
8e90: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
8ea0: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
8eb0: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
8ec0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
8ed0: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
8ee0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
8ef0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
8f00: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8f10: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
8f20: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8f30: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
8f40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8f50: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
8f60: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
8f70: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
8f80: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  t i;.      int a
8f90: 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  uth;            
8fa0: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72         /* Author
8fb0: 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74  ization to use t
8fc0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
8fd0: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
9000: 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63  aracters in func
9010: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
9020: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9030: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
9040: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
9050: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75  ame. */.      Fu
9060: 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
9070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
9080: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
9090: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
90a0: 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45       int enc = E
90b0: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20  NC(pParse->db); 
90c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
90d0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20   encoding */..  
90e0: 20 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a      zId = (char*
90f0: 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b  )pExpr->token.z;
9100: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
9110: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
9120: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
9130: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
9140: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
9150: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
9160: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
9170: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
9180: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
9190: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
91a0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
91b0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
91c0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
91d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
91e0: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
91f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9200: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
9210: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
9220: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9230: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
9240: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
9250: 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
9260: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
9270: 55 54 48 4f 52 49 5a 45 52 0a 20 20 20 20 20 20  UTHORIZER.      
9280: 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20  if( pDef ){.    
9290: 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74      auth = sqlit
92a0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
92b0: 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54  se, SQLITE_FUNCT
92c0: 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e  ION, 0, pDef->zN
92d0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
92e0: 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54   if( auth!=SQLIT
92f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9300: 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49    if( auth==SQLI
9310: 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20  TE_DENY ){.     
9320: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9330: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9340: 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74  not authorized t
9350: 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20  o use function: 
9360: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a           pDef->z
9390: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
93a0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
93b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
93c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
93d0: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
93e0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
93f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9400: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
9410: 28 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43  ( is_agg && !pNC
9420: 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20  ->allowAgg ){.  
9430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9440: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
9450: 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
9460: 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  te function %.*s
9470: 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20  ()", nId,zId);. 
9480: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
9490: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  ++;.        is_a
94a0: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  gg = 0;.      }e
94b0: 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f  lse if( no_such_
94c0: 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  func ){.        
94d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
94e0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
94f0: 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22   function: %.*s"
9500: 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
9510: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
9520: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9530: 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  ( wrong_num_args
9540: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9550: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9560: 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  se,"wrong number
9570: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
9580: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
9590: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
95a0: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
95b0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
95c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
95d0: 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20  ( is_agg ){.    
95e0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
95f0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b  TK_AGG_FUNCTION;
9600: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61  .        pNC->ha
9610: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
9620: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
9630: 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41  gg ) pNC->allowA
9640: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  gg = 0;.      fo
9650: 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72  r(i=0; pNC->nErr
9660: 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29  ==0 && i<n; i++)
9670: 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78  {.        walkEx
9680: 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  prTree(pList->a[
9690: 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  i].pExpr, nameRe
96a0: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
96b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
96c0: 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43  if( is_agg ) pNC
96d0: 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  ->allowAgg = 1;.
96e0: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
96f0: 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d    Compute pExpr-
9700: 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20  >affinity based 
9710: 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  on the expected 
9720: 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  return.      ** 
9730: 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63  type of the func
9740: 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  tion .      */. 
9750: 20 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61       return is_a
9760: 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  gg;.    }.#ifnde
9770: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
9780: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
9790: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
97a0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23  ase TK_EXISTS:.#
97b0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
97c0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
97d0: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
97e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
97f0: 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66  nRef = pNC->nRef
9800: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9810: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20  _OMIT_CHECK.    
9820: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43      if( pNC->isC
9830: 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  heck ){.        
9840: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9850: 67 28 70 50 61 72 73 65 2c 22 73 75 62 71 75 65  g(pParse,"subque
9860: 72 69 65 73 20 70 72 6f 68 69 62 69 74 65 64 20  ries prohibited 
9870: 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  in CHECK constra
9880: 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ints");.        
9890: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
98a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65   sqlite3SelectRe
98b0: 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 45  solve(pParse, pE
98c0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e  xpr->pSelect, pN
98d0: 43 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  C);.        asse
98e0: 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e  rt( pNC->nRef>=n
98f0: 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69  Ref );.        i
9900: 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52  f( nRef!=pNC->nR
9910: 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ef ){.          
9920: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
9930: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
9940: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
9950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9960: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
9970: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
9980: 48 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b  HECK.    case TK
9990: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
99a0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68     if( pNC->isCh
99b0: 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eck ){.        s
99c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
99d0: 50 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72  Parse,"parameter
99e0: 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
99f0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
9a00: 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s");.      }.   
9a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9a20: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
9a30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
9a40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
9a50: 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ks an expression
9a60: 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76   tree and resolv
9a70: 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  es references to
9a80: 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  .** table column
9a90: 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65  s.  Nodes of the
9aa0: 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49   form ID.ID or I
9ab0: 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61  D resolve into a
9ac0: 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68  n.** index to th
9ad0: 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74  e table in the t
9ae0: 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20  able list and a 
9af0: 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20  column offset.  
9b00: 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63  The .** Expr.opc
9b10: 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64  ode for such nod
9b20: 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  es is changed to
9b30: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65   TK_COLUMN.  The
9b40: 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20   Expr.iTable.** 
9b50: 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64  value is changed
9b60: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
9b70: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
9b80: 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
9b90: 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62  t.** plus the "b
9ba0: 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65  ase" value.  The
9bb0: 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c   base value will
9bc0: 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f   ultimately beco
9bd0: 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63  me the.** VDBE c
9be0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
9bf0: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69   a cursor that i
9c00: 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20  s pointing into 
9c10: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  the referenced.*
9c20: 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78  * table.  The Ex
9c30: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
9c40: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
9c50: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
9c60: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68  column .** of th
9c70: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
9c80: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
9c90: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20  olumn value for 
9ca0: 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52  the special.** R
9cb0: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d  OWID column is -
9cc0: 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20  1.  Any INTEGER 
9cd0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
9ce0: 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61  mn is tried as a
9cf0: 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52  n.** alias for R
9d00: 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  OWID..**.** Also
9d10: 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f   resolve functio
9d20: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63  n names and chec
9d30: 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20  k the functions 
9d40: 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73  for proper.** us
9d50: 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  age.  Make sure 
9d60: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  all function nam
9d70: 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65  es are recognize
9d80: 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69  d and all functi
9d90: 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ons.** have the 
9da0: 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
9db0: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65  f arguments.  Le
9dc0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
9dd0: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
9de0: 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e  e->zErrMsg if an
9df0: 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e  ything is amiss.
9e00: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
9e10: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
9e20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
9e30: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
9e40: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
9e50: 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68 65  ons then set the
9e60: 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65   EP_Agg.** prope
9e70: 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65  rty on the expre
9e80: 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssion..*/.int sq
9e90: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
9ea0: 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43 6f 6e  Names(.  NameCon
9eb0: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20  text *pNC,      
9ec0: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f   /* Namespace to
9ed0: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
9ee0: 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78  ions in. */.  Ex
9ef0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
9f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9f10: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
9f20: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
9f30: 69 6e 74 20 73 61 76 65 64 48 61 73 41 67 67 3b  int savedHasAgg;
9f40: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
9f50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 61  ) return 0;.  sa
9f60: 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d  vedHasAgg = pNC-
9f70: 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e  >hasAgg;.  pNC->
9f80: 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 61  hasAgg = 0;.  wa
9f90: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
9fa0: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
9fb0: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28 20  ep, pNC);.  if( 
9fc0: 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  pNC->nErr>0 ){. 
9fd0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9fe0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
9ff0: 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  or);.  }.  if( p
a000: 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20 20  NC->hasAgg ){.  
a010: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
a020: 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  y(pExpr, EP_Agg)
a030: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61  ;.  }else if( sa
a040: 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20  vedHasAgg ){.   
a050: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31   pNC->hasAgg = 1
a060: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45  ;.  }.  return E
a070: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a080: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
a090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .}../*.** A poin
a0a0: 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ter instance of 
a0b0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
a0c0: 73 20 75 73 65 64 20 74 6f 20 70 61 73 73 20 69  s used to pass i
a0d0: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68  nformation.** th
a0e0: 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72  rough walkExprTr
a0f0: 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71  ee into codeSubq
a100: 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74  ueryStep()..*/.t
a110: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 51 75  ypedef struct Qu
a120: 65 72 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f  eryCoder QueryCo
a130: 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72  der;.struct Quer
a140: 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65  yCoder {.  Parse
a150: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
a160: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
a170: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65  ontext */.  Name
a180: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20  Context *pNC;   
a190: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66   /* Namespace of
a1a0: 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67   first enclosing
a1b0: 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f   query */.};.../
a1c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
a1d0: 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75  de for scalar su
a1e0: 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73  bqueries used as
a1f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
a200: 2a 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f  * and IN operato
a210: 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  rs.  Examples:.*
a220: 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54  *.**     (SELECT
a230: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20   a FROM b)      
a240: 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a      -- subquery.
a250: 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53  **     EXISTS (S
a260: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
a270: 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71    -- EXISTS subq
a280: 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e  uery.**     x IN
a290: 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20   (4,5,11)       
a2a0: 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65         -- IN ope
a2b0: 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20  rator with list 
a2c0: 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
a2d0: 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  de.**     x IN (
a2e0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
a2f0: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
a300: 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72  tor with subquer
a310: 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a  y on the right.*
a320: 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
a330: 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62  arameter describ
a340: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
a350: 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
a360: 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74  the IN.** operat
a370: 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a  or or subquery..
a380: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
a390: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
a3a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
a3b0: 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65 20  Subselect(Parse 
a3c0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
a3d0: 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 74 65 73  Expr){.  int tes
a3e0: 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20 20  tAddr = 0;      
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
a410: 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56  t address */.  V
a420: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
a430: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a440: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
a450: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  turn;..  /* This
a460: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
a470: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
a480: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
a490: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
a4a0: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
a4b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
a4c0: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
a4d0: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
a4e0: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
a4f0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
a500: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
a510: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
a520: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
a530: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
a540: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
a550: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
a560: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
a570: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
a580: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
a590: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
a5a0: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
a5b0: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
a5c0: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
a5d0: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
a5e0: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
a5f0: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
a600: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
a610: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
a620: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
a630: 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21  _VarSelect) && !
a640: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
a650: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  k ){.    int mem
a660: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
a670: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
a680: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
a690: 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a  mLoad, mem, 0);.
a6a0: 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20 73      testAddr = s
a6b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a6c0: 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29 3b  v, OP_If, 0, 0);
a6d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65 73  .    assert( tes
a6e0: 74 41 64 64 72 3e 30 20 7c 7c 20 73 71 6c 69 74  tAddr>0 || sqlit
a6f0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
a700: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
a710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a720: 65 6d 49 6e 74 2c 20 31 2c 20 6d 65 6d 29 3b 0a  emInt, 1, mem);.
a730: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
a740: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
a750: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
a760: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
a770: 79 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  y;.      KeyInfo
a780: 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20   keyInfo;.      
a790: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
a7a0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
a7b0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
a7c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  instruction */..
a7d0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
a7e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
a7f0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
a800: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  t);..      /* Wh
a810: 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
a820: 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
a830: 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
a840: 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
a850: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
a860: 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
a870: 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20 76 69  e same way. A vi
a880: 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  rtual table is .
a890: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
a8a0: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
a8b0: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
a8c0: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
a8d0: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
a8e0: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
a8f0: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
a900: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
a910: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
a920: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
a930: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
a940: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
a950: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
a960: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
a970: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
a980: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
a990: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
a9a0: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
a9b0: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
a9c0: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
a9d0: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
a9e0: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
a9f0: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
aa00: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
aa10: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
aa20: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
aa30: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
aa40: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
aa50: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
aa60: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
aa70: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
aa80: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
aa90: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
aaa0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
aab0: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
aac0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
aad0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
aae0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
aaf0: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
ab00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab10: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
ab20: 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61  eral, pExpr->iTa
ab30: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d  ble, 0);.      m
ab40: 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20  emset(&keyInfo, 
ab50: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66  0, sizeof(keyInf
ab60: 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e  o));.      keyIn
ab70: 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20  fo.nField = 1;. 
ab80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ab90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
aba0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72  umColumns, pExpr
abb0: 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20  ->iTable, 1);.. 
abc0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
abd0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
abe0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
abf0: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
ac00: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
ac10: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
ac20: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
ac30: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
ac40: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
ac50: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
ac60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
ac70: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
ac80: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
ac90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
aca0: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78   int iParm = pEx
acb0: 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28  pr->iTable +  ((
acc0: 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c  (int)affinity)<<
acd0: 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  16);.        Exp
ace0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
acf0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
ad00: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78  pExpr->iTable&0x
ad10: 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72  0000FFFF)==pExpr
ad20: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
ad30: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
ad40: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
ad50: 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65  >pSelect, SRT_Se
ad60: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
ad70: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  0, 0);.        p
ad80: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
ad90: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
ada0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
adb0: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
adc0: 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20  xpr>0 ){ .      
add0: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
ade0: 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f 6d  l[0] = binaryCom
adf0: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
ae00: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ae10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ae20: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
ae30: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
ae40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
ae50: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
ae60: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
ae70: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
ae80: 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
ae90: 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68   **..** For each
aea0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
aeb0: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
aec0: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
aed0: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
aee0: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
aef0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
af00: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
af10: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
af20: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
af30: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
af40: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
af50: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
af60: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
af70: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
af80: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
af90: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
afa0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
afb0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
afc0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
afd0: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
afe0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
aff0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
b000: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
b010: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
b020: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
b030: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
b040: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b050: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
b060: 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  l[0] = pExpr->pL
b070: 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20  eft->pColl;..   
b080: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
b090: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
b0a0: 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
b0b0: 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  t>. */.        f
b0c0: 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
b0d0: 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
b0e0: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
b0f0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
b100: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
b110: 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
b120: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
b130: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
b140: 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20  t constant then 
b150: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a  we will need to.
b160: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73            ** dis
b170: 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74 68  able the test th
b180: 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
b190: 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65   above that make
b1a0: 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20 20  s sure.         
b1b0: 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e   ** this code on
b1c0: 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65  ly executes once
b1d0: 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20 61  .  Because for a
b1e0: 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20   non-constant.  
b1f0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
b200: 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f  ssion we need to
b210: 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65   rerun this code
b220: 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20   each time..    
b230: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b240: 20 20 20 69 66 28 20 74 65 73 74 41 64 64 72 3e     if( testAddr>
b250: 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
b260: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
b270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b280: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b290: 65 54 6f 4e 6f 6f 70 28 76 2c 20 74 65 73 74 41  eToNoop(v, testA
b2a0: 64 64 72 2d 31 2c 20 33 29 3b 0a 20 20 20 20 20  ddr-1, 3);.     
b2b0: 20 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20         testAddr 
b2c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
b2d0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
b2e0: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
b2f0: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
b300: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
b310: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
b320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b330: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
b340: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
b350: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b360: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
b370: 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20  , 0, &affinity, 
b380: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
b390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b3a0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
b3b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
b3c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b3d0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b3e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
b3f0: 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29  , addr, (void *)
b400: 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  &keyInfo, P3_KEY
b410: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65  INFO);.      bre
b420: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
b430: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20  ase TK_EXISTS:. 
b440: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
b450: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
b460: 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73  is has to be a s
b470: 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47  calar SELECT.  G
b480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
b490: 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  put the.      **
b4a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73   value of this s
b4b0: 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72  elect in a memor
b4c0: 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72  y cell and recor
b4d0: 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20  d the number.   
b4e0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d     ** of the mem
b4f0: 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
b500: 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  umn..      */.  
b510: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
b520: 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 28   Token one = { (
b530: 75 38 2a 29 22 31 22 2c 20 30 2c 20 31 20 7d 3b  u8*)"1", 0, 1 };
b540: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
b550: 53 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Sel;.      int i
b560: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  Mem;.      int s
b570: 6f 70 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72  op;..      pExpr
b580: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 4d 65 6d  ->iColumn = iMem
b590: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
b5a0: 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20  +;.      pSel = 
b5b0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
b5c0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
b5d0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
b5e0: 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20  {.        sop = 
b5f0: 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20  SRT_Mem;.       
b600: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b610: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c  p(v, OP_MemNull,
b620: 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20   iMem, 0);.     
b630: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b640: 76 2c 20 22 23 20 49 6e 69 74 20 73 75 62 71 75  v, "# Init subqu
b650: 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
b660: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b670: 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78      sop = SRT_Ex
b680: 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
b690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b6a0: 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
b6b0: 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  iMem);.        V
b6c0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b6d0: 23 20 49 6e 69 74 20 45 58 49 53 54 53 20 72 65  # Init EXISTS re
b6e0: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
b6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b700: 70 72 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70  prDelete(pSel->p
b710: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
b720: 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
b730: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45  ite3Expr(TK_INTE
b740: 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29  GER, 0, 0, &one)
b750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
b760: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
b770: 65 6c 2c 20 73 6f 70 2c 20 69 4d 65 6d 2c 20 30  el, sop, iMem, 0
b780: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b7a0: 20 7d 0a 0a 20 20 69 66 28 20 74 65 73 74 41 64   }..  if( testAd
b7b0: 64 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  dr ){.    sqlite
b7c0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b7d0: 20 74 65 73 74 41 64 64 72 29 3b 0a 20 20 7d 0a   testAddr);.  }.
b7e0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
b7f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b800: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
b810: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
b820: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
b830: 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
b840: 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
b850: 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
b860: 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63  n-1] on the stac
b870: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
b880: 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64  d codeInteger(Vd
b890: 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
b8a0: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
b8b0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73 71 6c  int i;.  if( sql
b8c0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20  ite3GetInt32(z, 
b8d0: 26 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  &i) ){.    sqlit
b8e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b8f0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29  P_Integer, i, 0)
b900: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
b910: 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74  lite3FitsIn64Bit
b920: 73 28 7a 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  s(z) ){.    sqli
b930: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
b940: 5f 49 6e 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c  _Int64, 0, 0, z,
b950: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
b960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
b970: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
b980: 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a  0, z, n);.  }.}.
b990: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b9a0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
b9b0: 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
b9c0: 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
b9d0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
b9e0: 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65 73  nd leave the res
b9f0: 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  ult on the top o
ba00: 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  f stack..**.** T
ba10: 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
ba20: 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
ba30: 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
ba40: 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
ba50: 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
ba60: 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
ba70: 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
ba80: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
ba90: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
baa0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
bab0: 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
bac0: 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
bad0: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
bae0: 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
baf0: 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
bb00: 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
bb10: 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
bb20: 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
bb30: 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
bb40: 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
bb50: 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
bb60: 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
bb70: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
bb80: 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  de(Parse *pParse
bb90: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
bba0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
bbb0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
bbc0: 20 6f 70 3b 0a 20 20 69 6e 74 20 73 74 61 63 6b   op;.  int stack
bbd0: 43 68 6e 67 20 3d 20 31 3b 20 20 20 20 2f 2a 20  Chng = 1;    /* 
bbe0: 41 6d 6f 75 6e 74 20 6f 66 20 63 68 61 6e 67 65  Amount of change
bbf0: 20 74 6f 20 73 74 61 63 6b 20 64 65 70 74 68 20   to stack depth 
bc00: 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  */..  if( v==0 )
bc10: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
bc20: 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Expr==0 ){.    s
bc30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bc40: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
bc50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
bc60: 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d   }.  op = pExpr-
bc70: 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
bc80: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
bc90: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  _AGG_COLUMN: {. 
bca0: 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41       AggInfo *pA
bcb0: 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  ggInfo = pExpr->
bcc0: 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
bcd0: 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
bce0: 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67  ol *pCol = &pAgg
bcf0: 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  Info->aCol[pExpr
bd00: 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69  ->iAgg];.      i
bd10: 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69  f( !pAggInfo->di
bd20: 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20  rectMode ){.    
bd30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bd40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
bd50: 61 64 2c 20 70 43 6f 6c 2d 3e 69 4d 65 6d 2c 20  ad, pCol->iMem, 
bd60: 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
bd70: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
bd80: 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
bd90: 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
bda0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bdb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
bdc0: 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73  umn, pAggInfo->s
bdd0: 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
be00: 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 29 3b 0a 20  SorterColumn);. 
be10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
be20: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f      }.      /* O
be30: 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74  therwise, fall t
be40: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f  hru into the TK_
be50: 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20  COLUMN case */. 
be60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
be70: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
be80: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
be90: 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
bea0: 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
beb0: 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67  pens when coding
bec0: 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e   check constrain
bed0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
bee0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b  sert( pParse->ck
bef0: 4f 66 66 73 65 74 3e 30 20 29 3b 0a 20 20 20 20  Offset>0 );.    
bf00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bf10: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
bf20: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
bf30: 2d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  -pExpr->iColumn-
bf40: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1, 1);.      }el
bf50: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  se if( pExpr->iC
bf60: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
bf70: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
bf80: 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
bf90: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
bfa0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
bfb0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70  ;.        int op
bfc0: 20 3d 20 28 70 54 61 62 20 26 26 20 49 73 56 69   = (pTab && IsVi
bfd0: 72 74 75 61 6c 28 70 54 61 62 29 29 20 3f 20 4f  rtual(pTab)) ? O
bfe0: 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43  P_VColumn : OP_C
bff0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 73  olumn;.        s
c000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c010: 76 2c 20 6f 70 2c 20 70 45 78 70 72 2d 3e 69 54  v, op, pExpr->iT
c020: 61 62 6c 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  able, iCol);.   
c030: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75       sqlite3Colu
c040: 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61  mnDefault(v, pTa
c050: 62 2c 20 69 43 6f 6c 29 3b 0a 23 69 66 6e 64 65  b, iCol);.#ifnde
c060: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
c070: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
c080: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26       if( pTab &&
c090: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c0a0: 5d 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ].affinity==SQLI
c0b0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 7b 0a 20  TE_AFF_REAL ){. 
c0c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c0d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c0e0: 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 30 2c  RealAffinity, 0,
c0f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23   0);.        }.#
c100: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
c110: 65 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  e{.        Table
c120: 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e   *pTab = pExpr->
c130: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e  pTab;.        in
c140: 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26 26 20  t op = (pTab && 
c150: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29  IsVirtual(pTab))
c160: 20 3f 20 4f 50 5f 56 52 6f 77 69 64 20 3a 20 4f   ? OP_VRowid : O
c170: 50 5f 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  P_Rowid;.       
c180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c190: 70 28 76 2c 20 6f 70 2c 20 70 45 78 70 72 2d 3e  p(v, op, pExpr->
c1a0: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
c1b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c1c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c1d0: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
c1e0: 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
c1f0: 76 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  v, (char*)pExpr-
c200: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
c210: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
c220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c230: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
c240: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
c250: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
c260: 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f  ert( TK_FLOAT==O
c270: 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  P_Real );.      
c280: 61 73 73 65 72 74 28 20 54 4b 5f 53 54 52 49 4e  assert( TK_STRIN
c290: 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38 20 29 3b  G==OP_String8 );
c2a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
c2b0: 71 75 6f 74 65 45 78 70 72 28 70 45 78 70 72 29  quoteExpr(pExpr)
c2c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c2d0: 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c  dbeOp3(v, op, 0,
c2e0: 20 30 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72   0, (char*)pExpr
c2f0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
c300: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
c310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c320: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
c330: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
c340: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c350: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
c360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c370: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c380: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
c390: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
c3a0: 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  B: {.      int n
c3b0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
c3c0: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73  ar *z;.      ass
c3d0: 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50  ert( TK_BLOB==OP
c3e0: 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20  _HexBlob );.    
c3f0: 20 20 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b    n = pExpr->tok
c400: 65 6e 2e 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20  en.n - 3;.      
c410: 7a 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70 72  z = (char*)pExpr
c420: 2d 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20  ->token.z + 2;. 
c430: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d       assert( n>=
c440: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
c450: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
c460: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20   = "";.      }. 
c470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c480: 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c  Op3(v, op, 0, 0,
c490: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 62 72   z, n);.      br
c4a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
c4b0: 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  f.    case TK_VA
c4c0: 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
c4d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c4e0: 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
c4f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
c500: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  0);.      if( pE
c510: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29  xpr->token.n>1 )
c520: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c530: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
c540: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 45 78 70   -1, (char*)pExp
c550: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
c560: 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  r->token.n);.   
c570: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c580: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c590: 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
c5a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c5b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c5c0: 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  Load, pExpr->iTa
c5d0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ble, 0);.      b
c5e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
c5f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c600: 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
c610: 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
c620: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
c630: 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
c640: 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
c650: 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  ) */.      int a
c660: 66 66 2c 20 74 6f 5f 6f 70 3b 0a 20 20 20 20 20  ff, to_op;.     
c670: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c680: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c690: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 66  pLeft);.      af
c6a0: 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  f = sqlite3Affin
c6b0: 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d 3e  ityType(&pExpr->
c6c0: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 74 6f  token);.      to
c6d0: 5f 6f 70 20 3d 20 61 66 66 20 2d 20 53 51 4c 49  _op = aff - SQLI
c6e0: 54 45 5f 41 46 46 5f 54 45 58 54 20 2b 20 4f 50  TE_AFF_TEXT + OP
c6f0: 5f 54 6f 54 65 78 74 3b 0a 20 20 20 20 20 20 61  _ToText;.      a
c700: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
c710: 5f 54 6f 54 65 78 74 20 20 20 20 7c 7c 20 61 66  _ToText    || af
c720: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  f!=SQLITE_AFF_TE
c730: 58 54 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  XT    );.      a
c740: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
c750: 5f 54 6f 42 6c 6f 62 20 20 20 20 7c 7c 20 61 66  _ToBlob    || af
c760: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f!=SQLITE_AFF_NO
c770: 4e 45 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61  NE    );.      a
c780: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
c790: 5f 54 6f 4e 75 6d 65 72 69 63 20 7c 7c 20 61 66  _ToNumeric || af
c7a0: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f!=SQLITE_AFF_NU
c7b0: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 20 20 61  MERIC );.      a
c7c0: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
c7d0: 5f 54 6f 49 6e 74 20 20 20 20 20 7c 7c 20 61 66  _ToInt     || af
c7e0: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f!=SQLITE_AFF_IN
c7f0: 54 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61  TEGER );.      a
c800: 73 73 65 72 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50  ssert( to_op==OP
c810: 5f 54 6f 52 65 61 6c 20 20 20 20 7c 7c 20 61 66  _ToReal    || af
c820: 66 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f!=SQLITE_AFF_RE
c830: 41 4c 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73  AL    );.      s
c840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c850: 76 2c 20 74 6f 5f 6f 70 2c 20 30 2c 20 30 29 3b  v, to_op, 0, 0);
c860: 0a 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67  .      stackChng
c870: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
c880: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
c890: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
c8a0: 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
c8b0: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
c8c0: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
c8d0: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
c8e0: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
c8f0: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
c900: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
c910: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
c920: 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
c930: 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
c940: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
c950: 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
c960: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c970: 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
c980: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c990: 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
c9a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c9b0: 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
c9c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c9d0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
c9e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c9f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ca00: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ca10: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
ca20: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
ca30: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
ca40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
ca50: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
ca60: 73 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a  stackChng = -1;.
ca70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ca80: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
ca90: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
caa0: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
cab0: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
cac0: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
cad0: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
cae0: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
caf0: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
cb00: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
cb10: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
cb20: 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
cb30: 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
cb40: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
cb50: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
cb60: 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
cb70: 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
cb80: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
cb90: 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
cba0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cbb0: 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
cbc0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
cbd0: 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
cbe0: 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
cbf0: 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
cc00: 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
cc10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
cc20: 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
cc30: 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
cc40: 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
cc50: 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
cc60: 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
cc70: 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
cc80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
cc90: 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
cca0: 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
ccb0: 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
ccc0: 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
ccd0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cce0: 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
ccf0: 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 73  oncat );.      s
cd00: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
cd10: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
cd20: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
cd30: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
cd40: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
cd50: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
cd60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
cd70: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
cd80: 74 61 63 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a 20  tackChng = -1;. 
cd90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cda0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
cdb0: 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
cdc0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
cdd0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
cde0: 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
cdf0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
ce00: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
ce10: 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  | pLeft->op==TK_
ce20: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
ce30: 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70     Token *p = &p
ce40: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
ce50: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
ce60: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 2d  qlite3MPrintf("-
ce70: 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e  %.*s", p->n, p->
ce80: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
ce90: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
cea0: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
ceb0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
cec0: 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30  v, OP_Real, 0, 0
ced0: 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20  , z, p->n+1);.  
cee0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cef0: 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
cf00: 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  er(v, z, p->n+1)
cf10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cf20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
cf30: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
cf40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cf50: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
cf60: 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20  into TK_NOT */. 
cf70: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
cf80: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
cf90: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
cfa0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
cfb0: 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
cfc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cfd0: 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
cfe0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
cff0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d000: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
d010: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d020: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
d030: 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  0);.      stackC
d040: 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  hng = 0;.      b
d050: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d060: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
d070: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
d080: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
d090: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61 73 73   dest;.      ass
d0a0: 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
d0b0: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
d0c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
d0d0: 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
d0e0: 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
d0f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d100: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
d110: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d120: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d130: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
d140: 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69       dest = sqli
d150: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
d160: 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20  dr(v) + 2;.     
d170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d180: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
d190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d1a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d1b0: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a  AddImm, -1, 0);.
d1c0: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
d1d0: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
d1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d1f0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
d200: 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
d210: 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72  o *pInfo = pExpr
d220: 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
d230: 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29    if( pInfo==0 )
d240: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d250: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d260: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
d270: 72 65 67 61 74 65 3a 20 25 54 22 2c 0a 20 20 20  regate: %T",.   
d280: 20 20 20 20 20 20 20 20 20 26 70 45 78 70 72 2d           &pExpr-
d290: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 65  >span);.      }e
d2a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
d2b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d2c0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 49 6e   OP_MemLoad, pIn
d2d0: 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
d2e0: 3e 69 41 67 67 5d 2e 69 4d 65 6d 2c 20 30 29 3b  >iAgg].iMem, 0);
d2f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d300: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d310: 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55  case TK_CONST_FU
d320: 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NC:.    case TK_
d330: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
d340: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d350: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
d360: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
d370: 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  r = pList ? pLis
d380: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  t->nExpr : 0;.  
d390: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
d3a0: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  f;.      int nId
d3b0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
d3c0: 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69  ar *zId;.      i
d3d0: 6e 74 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  nt constMask = 0
d3e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
d3f0: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
d400: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  C(pParse->db);. 
d410: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
d420: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  oll = 0;.      z
d430: 49 64 20 3d 20 28 63 68 61 72 2a 29 70 45 78 70  Id = (char*)pExp
d440: 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  r->token.z;.    
d450: 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74    nId = pExpr->t
d460: 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44  oken.n;.      pD
d470: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
d480: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
d490: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
d4a0: 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Expr, enc, 0);. 
d4b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
d4c0: 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45  f!=0 );.      nE
d4d0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
d4e0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
d4f0: 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 23 69  arse, pList);.#i
d500: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d510: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
d520: 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
d530: 20 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75   overload the fu
d540: 6e 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69  nction if the fi
d550: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  rst argument is.
d560: 20 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75        ** a virtu
d570: 61 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  al table column.
d580: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
d590: 2a 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e  ** For infix fun
d5a0: 63 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c  ctions (LIKE, GL
d5b0: 4f 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20  OB, REGEXP, and 
d5c0: 4d 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20  MATCH) use the. 
d5d0: 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61       ** second a
d5e0: 72 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65  rgument, not the
d5f0: 20 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61   first, as the a
d600: 72 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20  rgument to test 
d610: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
d620: 69 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d  if it is a colum
d630: 6e 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74  n in a virtual t
d640: 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64  able.  This is d
d650: 6f 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20  one because.    
d660: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70    ** the left op
d670: 65 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66  erand of infix f
d680: 75 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70  unctions (the op
d690: 65 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f  erand we want to
d6a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f  .      ** contro
d6b0: 6c 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65  l overloading) e
d6c0: 6e 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65  nds up as the se
d6d0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
d6e0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75   the.      ** fu
d6f0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70  nction.  The exp
d700: 72 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20  ression "A glob 
d710: 42 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  B" is equivalent
d720: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67   to .      ** "g
d730: 6c 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61  lob(B,A).  We wa
d740: 6e 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20  nt to use the A 
d750: 69 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f  in "A glob B" to
d760: 20 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66   test.      ** f
d770: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72  or function over
d780: 6c 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65  loading.  But we
d790: 20 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20   use the B term 
d7a0: 69 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a  in "glob(B,A)"..
d7b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
d7c0: 66 28 20 6e 45 78 70 72 3e 3d 32 20 26 26 20 28  f( nExpr>=2 && (
d7d0: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
d7e0: 50 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a  P_InfixFunc) ){.
d7f0: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
d800: 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f  qlite3VtabOverlo
d810: 61 64 46 75 6e 63 74 69 6f 6e 28 70 44 65 66 2c  adFunction(pDef,
d820: 20 6e 45 78 70 72 2c 20 70 4c 69 73 74 2d 3e 61   nExpr, pList->a
d830: 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
d840: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 45 78 70    }else if( nExp
d850: 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  r>0 ){.        p
d860: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
d870: 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
d880: 6e 28 70 44 65 66 2c 20 6e 45 78 70 72 2c 20 70  n(pDef, nExpr, p
d890: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
d8a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
d8b0: 66 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  f.      for(i=0;
d8c0: 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32   i<nExpr && i<32
d8d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d8e0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
d8f0: 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d  sConstant(pList-
d900: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
d910: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
d920: 61 73 6b 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20  ask |= (1<<i);. 
d930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d940: 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
d950: 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c  ollSeq && !pColl
d960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
d970: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
d980: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
d990: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
d9a0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
d9b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d9c0: 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
d9d0: 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  eq ){.        if
d9e0: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
d9f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
da00: 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
da10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
da20: 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
da30: 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
da40: 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
da50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
da60: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
da70: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
da80: 63 6f 6e 73 74 4d 61 73 6b 2c 20 6e 45 78 70 72  constMask, nExpr
da90: 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50  , (char*)pDef, P
daa0: 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  3_FUNCDEF);.    
dab0: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 31 2d    stackChng = 1-
dac0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 62 72 65  nExpr;.      bre
dad0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
dae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
daf0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
db00: 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
db10: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
db20: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
db30: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->iColumn==0 ){.
db40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
db50: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
db60: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
db70: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
db80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
db90: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
dba0: 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  ->iColumn, 0);. 
dbb0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
dbc0: 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75 62  ((v, "# load sub
dbd0: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
dbe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dbf0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
dc00: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
dc10: 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  addr;.      char
dc20: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
dc30: 20 69 6e 74 20 63 6b 4f 66 66 73 65 74 20 3d 20   int ckOffset = 
dc40: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
dc50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
dc60: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
dc70: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  rse, pExpr);..  
dc80: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
dc90: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
dca0: 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20  o use to create 
dcb0: 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72  a key from the r
dcc0: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
dcd0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
dce0: 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
dcf0: 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
dd00: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
dd10: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f  or.      ** P3 o
dd20: 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
dd30: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
dd40: 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61  affinity = compa
dd50: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
dd60: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  xpr);..      sql
dd70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
dd80: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
dd90: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
dda0: 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63 6b 4f  ->ckOffset = ckO
ddb0: 66 66 73 65 74 2b 31 3b 0a 0a 20 20 20 20 20 20  ffset+1;..      
ddc0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
ddd0: 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
dde0: 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
ddf0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
de00: 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
de10: 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
de20: 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
de30: 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
de40: 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
de50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
de60: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
de70: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
de80: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
de90: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
dea0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
deb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
dec0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
ded0: 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20  dr+4);          
dee0: 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f    /* addr + 0 */
def0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
df00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
df10: 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 2, 0);.      
df20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
df30: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
df40: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
df50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
df60: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37  _Goto, 0, addr+7
df70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
df80: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  VdbeOp3(v, OP_Ma
df90: 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20  keRecord, 1, 0, 
dfa0: 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20 20  &affinity, 1);  
dfb0: 20 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a   /* addr + 4 */.
dfc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dfd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75  eAddOp(v, OP_Fou
dfe0: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
dff0: 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20  e, addr+7);.    
e000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e010: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
e020: 20 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20 20   -1, 0);        
e030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64            /* add
e040: 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20  r + 6 */..      
e050: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
e060: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
e070: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
e080: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
e090: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
e0a0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
e0b0: 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
e0c0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
e0d0: 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
e0e0: 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
e0f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
e100: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e110: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
e120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e130: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
e140: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e150: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e160: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
e170: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
e180: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
e190: 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  ight, OP_Ge, 0, 
e1a0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e1b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e1c0: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
e1d0: 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20      pLItem++;.  
e1e0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49      pRight = pLI
e1f0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
e200: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e210: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
e220: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
e230: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
e240: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
e250: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
e260: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e270: 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30  (v, OP_And, 0, 0
e280: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e290: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e2a0: 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  K_UPLUS:.    cas
e2b0: 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
e2c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e2d0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e2e0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 74  pLeft);.      st
e2f0: 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
e300: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e310: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45      case TK_CASE
e320: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78  : {.      int ex
e330: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20  pr_end_label;.  
e340: 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74      int jumpInst
e350: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70  ;.      int nExp
e360: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  r;.      int i;.
e370: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
e380: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74  pEList;.      st
e390: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
e3a0: 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a  em *aListelem;..
e3b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
e3c0: 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
e3d0: 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d    assert((pExpr-
e3e0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20  >pList->nExpr % 
e3f0: 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20  2) == 0);.      
e400: 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c  assert(pExpr->pL
e410: 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b  ist->nExpr > 0);
e420: 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
e430: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
e440: 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
e450: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
e460: 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
e470: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78  >nExpr;.      ex
e480: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73  pr_end_label = s
e490: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
e4a0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
e4b0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
e4c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e4d0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e4e0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
e4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
e500: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
e510: 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
e520: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e530: 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
e540: 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  em[i].pExpr);.  
e550: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
e560: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
e570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e580: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
e590: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 1);.         
e5a0: 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65   jumpInst = code
e5b0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
e5c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c  pExpr->pLeft, aL
e5d0: 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
e5e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b     OP_Ne, 0, 1);
e610: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e620: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e630: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
e640: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e650: 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20         jumpInst 
e660: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e670: 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  Op(v, OP_IfNot, 
e680: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
e690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e6a0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e6b0: 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
e6c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
e6d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e6e0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
e6f0: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b  expr_end_label);
e700: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e710: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e720: 6a 75 6d 70 49 6e 73 74 29 3b 0a 20 20 20 20 20  jumpInst);.     
e730: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
e740: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
e750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e760: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
e770: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
e780: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
e790: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
e7a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e7b0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
e7c0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
e7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e7e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e7f0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
e800: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
e810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
e820: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70  olveLabel(v, exp
e830: 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20  r_end_label);.  
e840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e850: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e860: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
e870: 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
e880: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
e890: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
e8a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e8b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e8c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e8d0: 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
e8e0: 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
e8f0: 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
e900: 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 09  ger-program");..
e910: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
e920: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
e930: 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e  >iColumn!=OE_Ign
e940: 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ore ){.         
e950: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
e960: 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62  Column==OE_Rollb
e970: 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ack ||.         
e980: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
e990: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f  Column == OE_Abo
e9a0: 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  rt ||.          
e9b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
e9c0: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c  olumn == OE_Fail
e9d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   );.         sql
e9e0: 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72 28  ite3DequoteExpr(
e9f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
ea00: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
ea10: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
ea20: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70  TE_CONSTRAINT, p
ea30: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 45         (char*)pE
ea60: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
ea70: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
ea80: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
ea90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eaa0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
eab0: 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20   OE_Ignore );.  
eac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ead0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
eae0: 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b  ntextPop, 0, 0);
eaf0: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
eb00: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
eb10: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
eb20: 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e  ->trigStack->ign
eb30: 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20  oreJump);.      
eb40: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
eb50: 76 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f  v, "# raise(IGNO
eb60: 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  RE)"));.      }.
eb70: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
eb80: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
eb90: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
eba0: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
ebb0: 2d 3e 63 6b 4f 66 66 73 65 74 20 29 7b 0a 20 20  ->ckOffset ){.  
ebc0: 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73    pParse->ckOffs
ebd0: 65 74 20 2b 3d 20 73 74 61 63 6b 43 68 6e 67 3b  et += stackChng;
ebe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ebf0: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 29 3b  rse->ckOffset );
ec00: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
ec10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
ec20: 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  GER./*.** Genera
ec30: 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
ec40: 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  lutes the given 
ec50: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c  expression and l
ec60: 65 61 76 65 73 20 74 68 65 20 72 65 73 75 6c 74  eaves the result
ec70: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  .** on the stack
ec80: 2e 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  .  See also sqli
ec90: 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a 2a  te3ExprCode()..*
eca0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ecb0: 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61 63  e might also cac
ecc0: 68 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e  he the result an
ecd0: 64 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45 78  d modify the pEx
ece0: 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74 68  pr tree.** so th
ecf0: 61 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65 20  at it will make 
ed00: 75 73 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  use of the cache
ed10: 64 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  d result on subs
ed20: 65 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69 6f  equent evaluatio
ed30: 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  ns.** rather tha
ed40: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 77  n evaluate the w
ed50: 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  hole expression 
ed60: 61 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c 20  again.  Trivial 
ed70: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a  expressions are.
ed80: 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20 20  ** not cached.  
ed90: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
eda0: 6e 20 69 73 20 63 61 63 68 65 64 2c 20 69 74 73  n is cached, its
edb0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
edc0: 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72  d in a .** memor
edd0: 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  y location..*/.v
ede0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
edf0: 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
ee00: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
ee10: 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20  *pExpr){.  Vdbe 
ee20: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ee30: 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  be;.  int iMem;.
ee40: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
ee50: 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  r2;.  if( v==0 )
ee60: 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72 31   return;.  addr1
ee70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
ee80: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
ee90: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
eea0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
eeb0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
eec0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
eed0: 28 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72 32  (v);.  if( addr2
eee0: 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c 69  >addr1+1 || sqli
eef0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
ef00: 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d  addr1)->opcode==
ef10: 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a 20  OP_Function ){. 
ef20: 20 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72 2d     iMem = pExpr-
ef30: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
ef40: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71  ->nMem++;.    sq
ef50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ef60: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
ef70: 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45 78  Mem, 0);.    pEx
ef80: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49  pr->op = TK_REGI
ef90: 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  STER;.  }.}.#end
efa0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
efb0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
efc0: 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
efd0: 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
efe0: 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
eff0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f  xpression list o
f000: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a  nto the stack..*
f010: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f020: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
f030: 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20 74  ts pushed onto t
f040: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74  he stack..*/.int
f050: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f060: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
f070: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
f080: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
f090: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
f0a0: 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65  *pList    /* The
f0b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
f0c0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
f0d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
f0e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
f0f0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
f100: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
f110: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 70  eturn 0;.  n = p
f120: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
f130: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
f140: 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d  a, i=n; i>0; i--
f150: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
f160: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f170: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
f180: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
f190: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
f1a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
f1b0: 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
f1c0: 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
f1d0: 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
f1e0: 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
f1f0: 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
f200: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
f210: 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
f220: 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
f230: 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
f240: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
f250: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
f260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
f270: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
f280: 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
f290: 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
f2a0: 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
f2b0: 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
f2c0: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  l flag is true..
f2d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
f2e0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
f2f0: 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
f300: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
f310: 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
f320: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
f330: 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
f340: 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
f350: 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
f360: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
f370: 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
f380: 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
f390: 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
f3a0: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
f3b0: 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
f3c0: 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
f3d0: 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
f3e0: 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
f3f0: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
f400: 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
f410: 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
f420: 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
f430: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f440: 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
f450: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
f460: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
f470: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
f480: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f490: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f4a0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
f4b0: 74 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61  t ckOffset = pPa
f4c0: 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20  rse->ckOffset;. 
f4d0: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
f4e0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
f4f0: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
f500: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
f510: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
f520: 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
f530: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
f540: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f550: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
f560: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
f570: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
f580: 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20  !jumpIfNull);.  
f590: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
f5a0: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
f5b0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
f5c0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
f5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f5e0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f5f0: 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
f600: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f610: 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
f620: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
f630: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
f640: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
f650: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
f660: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
f670: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
f680: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
f690: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
f6a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f6b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
f6c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f6d0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
f6e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f6f0: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
f700: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
f710: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f720: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
f730: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
f740: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
f750: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
f760: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
f770: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
f780: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
f790: 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
f7a0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
f7b0: 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
f7c0: 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
f7d0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
f7e0: 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
f7f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f800: 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
f810: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f820: 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
f830: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f840: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
f850: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
f860: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f870: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
f880: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
f890: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
f8a0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f8b0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
f8c0: 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   op, dest, jumpI
f8d0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
f8e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f8f0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
f900: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
f910: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
f920: 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
f930: 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
f940: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
f950: 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
f960: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
f970: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f980: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
f990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f9a0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
f9b0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
f9c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f9d0: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
f9e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
f9f0: 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45  expression "x BE
fa00: 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69  TWEEN y AND z" i
fa10: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
fa20: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
fa30: 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29   ** 1 IF (x < y)
fa40: 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
fa50: 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47   2 IF (x <= z) G
fa60: 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
fa70: 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20   ** 3 ....      
fa80: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
fa90: 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
faa0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
fab0: 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
fac0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
fad0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
fae0: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
faf0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
fb00: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
fb10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb20: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
fb30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fb40: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fb50: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
fb60: 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61  addr = codeCompa
fb70: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
fb80: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c  , pRight, OP_Lt,
fb90: 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29   0, !jumpIfNull)
fba0: 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  ;..      pRight 
fbb0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
fbc0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
fbd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
fbe0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
fbf0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
fc00: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
fc10: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
fc20: 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  e, dest, jumpIfN
fc30: 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ull);..      sql
fc40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
fc50: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
fc60: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
fc70: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fc80: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71   addr);.      sq
fc90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fca0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
fcb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fcc0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
fcd0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
fce0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fcf0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
fd00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
fd10: 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66  v, OP_If, jumpIf
fd20: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
fd30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fd40: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b    }.  pParse->ck
fd50: 4f 66 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65  Offset = ckOffse
fd60: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  t;.}../*.** Gene
fd70: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
fd80: 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
fd90: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
fda0: 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
fdb0: 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
fdc0: 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
fdd0: 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
fde0: 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
fdf0: 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
fe00: 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
fe10: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
fe20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
fe30: 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
fe40: 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
fe50: 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
fe60: 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
fe70: 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
fe80: 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20  is true or fall 
fe90: 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
fea0: 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a  fNull is false..
feb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
fec0: 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
fed0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
fee0: 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
fef0: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
ff00: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
ff10: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
ff20: 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
ff30: 20 63 6b 4f 66 66 73 65 74 20 3d 20 70 50 61 72   ckOffset = pPar
ff40: 73 65 2d 3e 63 6b 4f 66 66 73 65 74 3b 0a 20 20  se->ckOffset;.  
ff50: 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70  if( v==0 || pExp
ff60: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  r==0 ) return;..
ff70: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
ff80: 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
ff90: 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
ffa0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
ffb0: 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
ffc0: 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
ffd0: 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
ffe0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
fff0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
10000 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
10010 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
10020 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
10030 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
10040 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
10050 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
10060 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
10070 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
10080 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
10090 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
100a0 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
100b0 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
100c0 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
100d0 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
100e0 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
100f0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
10100 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
10110 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
10120 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
10130 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
10140 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
10150 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
10160 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
10170 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
10180 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
10190 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
101a0 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
101b0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
101c0 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
101d0 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
101e0 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
101f0 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
10200 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
10210 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
10220 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
10230 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
10240 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
10250 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
10260 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
10270 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
10280 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
10290 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
102a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
102b0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
102c0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
102d0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
102e0 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
102f0 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
10300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
10310 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
10320 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
10330 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
10340 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
10350 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
10360 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
10370 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
10380 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
10390 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
103a0 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
103b0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
103c0 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
103d0 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
103e0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
103f0 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
10400 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
10410 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
10420 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
10430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10440 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
10450 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10460 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
10470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10480 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
10490 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
104a0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
104b0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
104c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
104d0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
104e0 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
104f0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
10500 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10510 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
10520 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
10530 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c   d2, !jumpIfNull
10540 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10550 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
10560 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
10570 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
10580 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
10590 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
105a0 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
105b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
105c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
105d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
105e0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
105f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
10600 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
10610 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10620 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10630 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
10640 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
10650 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
10660 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
10670 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
10680 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_EQ: {.      sq
10690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
106a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
106b0 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
106c0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
106d0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
106e0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
106f0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
10700 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
10710 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65  ->pRight, op, de
10720 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
10730 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10740 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
10750 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
10760 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
10770 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10780 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
10790 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
107a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
107b0 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
107c0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
107d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
107e0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
107f0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
10800 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57  ssion is "x BETW
10810 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74  EEN y AND z". It
10820 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
10830 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
10840 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d     ** 1 IF (x >=
10850 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20   y) GOTO 3.     
10860 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74   ** 2 GOTO <dest
10870 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20  >.      ** 3 IF 
10880 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65  (x > z) GOTO <de
10890 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st>.      */.   
108a0 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
108b0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
108c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
108d0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
108e0 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
108f0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
10900 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10910 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ode(pParse, pLef
10920 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10930 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10940 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
10950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10960 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
10970 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
10980 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
10990 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
109a0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
109b0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
109c0 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72  ght, OP_Ge, addr
109d0 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29  +3, !jumpIfNull)
109e0 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
109f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a00 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
10a10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10a20 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
10a30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70  , dest);.      p
10a40 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
10a50 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
10a60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
10a70 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
10a80 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
10a90 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
10aa0 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
10ab0 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a  , OP_Gt, dest, j
10ac0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
10ad0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10ae0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
10af0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10b00 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
10b10 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
10b20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10b30 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75  _IfNot, jumpIfNu
10b40 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ll, dest);.     
10b50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10b60 7d 0a 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  }.  pParse->ckOf
10b70 66 73 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 3b  fset = ckOffset;
10b80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64  .}../*.** Do a d
10b90 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  eep comparison o
10ba0 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  f two expression
10bb0 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20   trees.  Return 
10bc0 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a  TRUE (non-zero).
10bd0 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69  ** if they are i
10be0 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74  dentical and ret
10bf0 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
10c00 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20  y differ in any 
10c10 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  way..*/.int sqli
10c20 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45  te3ExprCompare(E
10c30 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70  xpr *pA, Expr *p
10c40 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  B){.  int i;.  i
10c50 66 28 20 70 41 3d 3d 30 7c 7c 70 42 3d 3d 30 20  f( pA==0||pB==0 
10c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
10c70 3d 3d 70 41 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ==pA;.  }.  if( 
10c80 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29  pA->op!=pB->op )
10c90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
10ca0 20 28 70 41 2d 3e 66 6c 61 67 73 20 26 20 45 50   (pA->flags & EP
10cb0 5f 44 69 73 74 69 6e 63 74 29 21 3d 28 70 42 2d  _Distinct)!=(pB-
10cc0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
10cd0 69 6e 63 74 29 20 29 20 72 65 74 75 72 6e 20 30  inct) ) return 0
10ce0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
10cf0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
10d00 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
10d10 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
10d20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
10d30 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
10d40 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
10d50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10d60 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pA->pList ){. 
10d70 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74     if( pB->pList
10d80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
10d90 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73      if( pA->pLis
10da0 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c  t->nExpr!=pB->pL
10db0 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
10dc0 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
10dd0 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d  =0; i<pA->pList-
10de0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
10df0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
10e00 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
10e10 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
10e20 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b  r, pB->pList->a[
10e30 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
10e40 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10e50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10e60 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69  else if( pB->pLi
10e70 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
10e80 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
10e90 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d  ->pSelect || pB-
10ea0 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  >pSelect ) retur
10eb0 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 0;.  if( pA->i
10ec0 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
10ed0 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
10ee0 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
10ef0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10f00 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20  pA->token.z ){. 
10f10 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
10f20 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  .z==0 ) return 0
10f30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  ;.    if( pB->to
10f40 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e  ken.n!=pA->token
10f50 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .n ) return 0;. 
10f60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
10f70 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 41  rNICmp((char*)pA
10f80 2d 3e 74 6f 6b 65 6e 2e 7a 2c 28 63 68 61 72 2a  ->token.z,(char*
10f90 29 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 70 42 2d  )pB->token.z,pB-
10fa0 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 7b 0a  >token.n)!=0 ){.
10fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10fc0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10fd0 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 1;.}.../*.** 
10fe0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
10ff0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
11000 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e  o->aCol[] array.
11010 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
11020 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ex of.** the new
11030 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72   element.  Retur
11040 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
11050 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ber if malloc fa
11060 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
11070 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c  nt addAggInfoCol
11080 75 6d 6e 28 41 67 67 49 6e 66 6f 20 2a 70 49 6e  umn(AggInfo *pIn
11090 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
110a0 69 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  i = sqlite3Array
110b0 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69 64 2a 2a  Allocate((void**
110c0 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 20 73  )&pInfo->aCol, s
110d0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61 43 6f  izeof(pInfo->aCo
110e0 6c 5b 30 5d 29 2c 20 33 29 3b 0a 20 20 69 66 28  l[0]), 3);.  if(
110f0 20 69 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75   i<0 ){.    retu
11100 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74  rn -1;.  }.  ret
11110 75 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a  urn i;.}    ../*
11120 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
11130 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
11140 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61  gInfo->aFunc[] a
11150 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68  rray.  Return th
11160 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68  e index of.** th
11170 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20  e new element.  
11180 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
11190 65 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c  e number if mall
111a0 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  oc fails..*/.sta
111b0 74 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e  tic int addAggIn
111c0 66 6f 46 75 6e 63 28 41 67 67 49 6e 66 6f 20 2a  foFunc(AggInfo *
111d0 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b  pInfo){.  int i;
111e0 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41 72  .  i = sqlite3Ar
111f0 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f 69  rayAllocate((voi
11200 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e 61 46 75 6e  d**)&pInfo->aFun
11210 63 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  c, sizeof(pInfo-
11220 3e 61 46 75 6e 63 5b 30 5d 29 2c 20 32 29 3b 0a  >aFunc[0]), 2);.
11230 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
11240 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
11250 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
11260 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
11270 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
11280 6c 6b 45 78 70 72 54 72 65 65 28 29 20 75 73 65  lkExprTree() use
11290 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a  d to implement .
112a0 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ** sqlite3ExprAn
112b0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
112c0 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
112d0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
112e0 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
112f0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
11300 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
11310 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
11320 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
11330 6e 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e  nction at pExpr.
11340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
11350 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28  nalyzeAggregate(
11360 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72  void *pArg, Expr
11370 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
11380 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
11390 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
113a0 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50  text *)pArg;.  P
113b0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
113c0 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
113d0 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
113e0 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
113f0 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  .  AggInfo *pAgg
11400 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41 67 67  Info = pNC->pAgg
11410 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20 73 77 69 74  Info;.  ..  swit
11420 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
11430 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
11440 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
11450 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
11460 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
11470 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
11480 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
11490 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
114a0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
114b0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
114c0 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
114d0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
114e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
114f0 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
11500 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
11510 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
11520 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
11530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
11540 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
11550 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
11560 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
11570 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
11580 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
11590 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
115a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
115b0 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
115c0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
115d0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
115e0 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
115f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
11600 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
11610 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
11620 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
11630 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
11640 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
11650 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
11660 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
11670 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
11680 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
11690 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
116a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
116b0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
116c0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
116d0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
116e0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
116f0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 2c 20 70 43  nColumn; i++, pC
11700 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
11710 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
11720 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
11730 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
11740 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
11750 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
11760 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
11770 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11790 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
117a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
117b0 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  i>=pAggInfo->nCo
117c0 6c 75 6d 6e 20 26 26 20 28 69 20 3d 20 61 64 64  lumn && (i = add
117d0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 41  AggInfoColumn(pA
117e0 67 67 49 6e 66 6f 29 29 3e 3d 30 20 29 7b 0a 20  ggInfo))>=0 ){. 
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
11800 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
11810 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
11820 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
11830 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
11840 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
11850 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
11860 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
11870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11880 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  pCol->iMem = pPa
11890 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
118a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
118b0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
118c0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
118d0 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
118e0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
118f0 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
11900 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
11930 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
11940 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
11950 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
11970 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11980 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
11990 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
119a0 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
119b0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
119c0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
119d0 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
119e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119f0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
11a00 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
11a20 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
11a30 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
11a40 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
11a50 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
11a60 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
11a70 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
11a80 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
11aa0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
11ab0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
11ac0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
11af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11b10 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
11b20 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
11b30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11b40 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
11b50 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
11b60 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
11b70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
11b80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
11b90 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
11ba0 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
11bb0 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
11bc0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
11bd0 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
11be0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
11bf0 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
11c00 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
11c10 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
11c20 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
11c30 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
11c40 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
11c50 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
11c60 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
11c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
11c80 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
11c90 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
11ca0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
11cb0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
11cc0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
11cd0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
11ce0 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f  ->op = TK_AGG_CO
11cf0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
11d00 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
11d10 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  i;.            b
11d20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
11d30 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72  } /* endif pExpr
11d40 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
11d50 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20  >iCursor */.    
11d60 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f      } /* end loo
11d70 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  p over pSrcList 
11d80 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
11d90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
11da0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
11db0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
11dc0 20 20 20 2f 2a 20 54 68 65 20 70 4e 43 2d 3e 6e     /* The pNC->n
11dd0 44 65 70 74 68 3d 3d 30 20 74 65 73 74 20 63 61  Depth==0 test ca
11de0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
11df0 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 75 62 71  unctions in subq
11e00 75 65 72 69 65 73 0a 20 20 20 20 20 20 2a 2a 20  ueries.      ** 
11e10 74 6f 20 62 65 20 69 67 6e 6f 72 65 64 20 2a 2f  to be ignored */
11e20 0a 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  .      if( pNC->
11e30 6e 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20  nDepth==0 ){.   
11e40 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
11e50 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
11e60 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
11e70 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
11e80 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
11e90 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
11ea0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
11eb0 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
11ec0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11ed0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
11ee0 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
11ef0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
11f00 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
11f10 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
11f20 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
11f30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
11f40 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
11f50 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
11f60 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20  pr, pExpr) ){.  
11f70 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11f80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
11fa0 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
11fb0 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
11fc0 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
11fd0 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
11fe0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
11ff0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
12000 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
12010 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
12020 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
12030 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
12040 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 41  ddAggInfoFunc(pA
12050 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
12060 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b 0a 20     if( i>=0 ){. 
12070 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
12080 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
12090 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
120a0 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
120b0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
120c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
120d0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
120e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
120f0 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
12100 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
12110 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e    (char*)pExpr->
12140 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
12150 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20  token.n,.       
12160 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
12170 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  r->pList ? pExpr
12180 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
12190 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
121a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
121b0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
121c0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
121d0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
121e0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
121f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12200 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
12220 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
12230 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
12240 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
12250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12260 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
12270 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
12280 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
12290 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
122a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
122b0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
122c0 69 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  i;.        pExpr
122d0 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
122e0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72  gInfo;.        r
122f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
12300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12310 20 52 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c   Recursively wal
12320 6b 20 73 75 62 71 75 65 72 69 65 73 20 6c 6f 6f  k subqueries loo
12330 6b 69 6e 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55  king for TK_COLU
12340 4d 4e 20 6e 6f 64 65 73 20 74 68 61 74 20 6e 65  MN nodes that ne
12350 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 63 68  ed.  ** to be ch
12360 61 6e 67 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f  anged to TK_AGG_
12370 43 4f 4c 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63  COLUMN.  But inc
12380 72 65 6d 65 6e 74 20 6e 44 65 70 74 68 20 73 6f  rement nDepth so
12390 20 74 68 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47   that.  ** TK_AG
123a0 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
123b0 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 20 77   in subqueries w
123c0 69 6c 6c 20 62 65 20 75 6e 63 68 61 6e 67 65 64  ill be unchanged
123d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
123e0 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
123f0 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b     pNC->nDepth++
12400 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74  ;.    walkSelect
12410 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c  Expr(pExpr->pSel
12420 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72  ect, analyzeAggr
12430 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20  egate, pNC);.   
12440 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a   pNC->nDepth--;.
12450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
12460 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
12470 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
12480 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
12490 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
124a0 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
124b0 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
124c0 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
124d0 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
124e0 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  aAgg[] array..**
124f0 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c   Make additional
12500 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
12510 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
12520 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72  rray as necessar
12530 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
12540 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
12550 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
12560 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
12570 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
12580 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
12590 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
125a0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
125b0 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
125c0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
125d0 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
125e0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
125f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
12600 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
12610 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
12620 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
12630 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
12640 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45  pExpr){.  int nE
12650 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  rr = pNC->pParse
12660 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78  ->nErr;.  walkEx
12670 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e  prTree(pExpr, an
12680 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
12690 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pNC);.  return p
126a0 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72  NC->pParse->nErr
126b0 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a   - nErr;.}../*.*
126c0 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78  * Call sqlite3Ex
126d0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
126e0 74 65 73 28 29 20 66 6f 72 20 65 76 65 72 79 20  tes() for every 
126f0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e  expression in an
12700 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
12710 69 73 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ist.  Return the
12720 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
12730 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
12740 72 72 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  rror is found, t
12750 68 65 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63  he analysis is c
12760 75 74 20 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74  ut short..*/.int
12770 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
12780 79 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43  yzeAggList(NameC
12790 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
127a0 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
127b0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
127c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
127d0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 45 72  int i;.  int nEr
127e0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69  r = 0;.  if( pLi
127f0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  st ){.    for(pI
12800 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
12810 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
12820 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
12830 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
12840 20 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74     nErr += sqlit
12850 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
12860 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70 49 74  regates(pNC, pIt
12870 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
12880 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
12890 45 72 72 3b 0a 7d 0a                             Err;.}.