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

Artifact 3ea9b26c6cdb7bcf0715c1b6aa0f7f5e813f61eb:


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 35 39 20 32 30 30 36 2f 30 36 2f 31 31 20  .259 2006/06/11 
0220: 32 33 3a 34 31 3a 35 35 20 64 72 68 20 45 78 70  23:41:55 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a 20  ( op==TK_AS ){. 
04d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
04e0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
04f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d  xpr->pLeft);.  }
0500: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0510: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
0520: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
0530: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53  finity(pExpr->pS
0540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
0550: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [0].pExpr);.  }.
0560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0570: 4d 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f  MIT_CAST.  if( o
0580: 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20  p==TK_CAST ){.  
0590: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
05a0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
05b0: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d  xpr->token);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
05d0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
05e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
05f0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  n the default co
0600: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0610: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0620: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0630: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0640: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74  ault collation t
0650: 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ype, return 0..*
0660: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
0670: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61  e3ExprCollSeq(Pa
0680: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0690: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
06a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
06b0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
06c0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70      pColl = pExp
06d0: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  r->pColl;.    if
06e0: 28 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ( (pExpr->op==TK
06f0: 5f 41 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _AS || pExpr->op
0700: 3d 3d 54 4b 5f 43 41 53 54 29 20 26 26 20 21 70  ==TK_CAST) && !p
0710: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
0720: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0730: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0740: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
0750: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
0760: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
0770: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0780: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0790: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
07a0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
07b0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
07c0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
07d0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
07e0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
07f0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0800: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0810: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
0820: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
0830: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0840: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
0850: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
0860: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0870: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0880: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0890: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
08a0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
08b0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
08c0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
08d0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
08e0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
08f0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0900: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0910: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
0920: 68 61 73 20 6e 75 6d 65 72 69 63 0a 20 20 20 20  has numeric.    
0930: 2a 2a 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65  ** affinity, use
0940: 20 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65   that. Otherwise
0950: 20 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79   use no affinity
0960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
0970: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69   sqlite3IsNumeri
0980: 63 41 66 66 69 6e 69 74 79 28 61 66 66 31 29 20  cAffinity(aff1) 
0990: 7c 7c 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 65  || sqlite3IsNume
09a0: 72 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32  ricAffinity(aff2
09b0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
09c0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
09d0: 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ERIC;.    }else{
09e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
09f0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
0a00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
0a10: 20 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20   !aff1 && !aff2 
0a20: 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  ){.    /* Neithe
0a30: 72 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f  r side of the co
0a40: 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
0a50: 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74  lumn.  Compare t
0a60: 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  he.    ** result
0a70: 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20  s directly..    
0a80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
0a90: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
0aa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
0ab0: 6e 65 20 73 69 64 65 20 69 73 20 61 20 63 6f 6c  ne side is a col
0ac0: 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 69  umn, the other i
0ad0: 73 20 6e 6f 74 2e 20 55 73 65 20 74 68 65 20 63  s not. Use the c
0ae0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e  olumns affinity.
0af0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
0b00: 61 66 66 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d  aff1==0 || aff2=
0b10: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
0b20: 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b 0a   (aff1 + aff2);.
0b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78    }.}../*.** pEx
0b40: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
0b50: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52 65  on operator.  Re
0b60: 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61 66  turn the type af
0b70: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
0b80: 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65 64  ld.** be applied
0b90: 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   to both operand
0ba0: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
0bb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
0bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
0bd0: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
0be0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b  ty(Expr *pExpr){
0bf0: 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 61  .  char aff;.  a
0c00: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
0c10: 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72  ==TK_EQ || pExpr
0c20: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70  ->op==TK_IN || p
0c30: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20  Expr->op==TK_LT 
0c40: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
0c50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c  pr->op==TK_GT ||
0c60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
0c70: 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  E || pExpr->op==
0c80: 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20  TK_LE ||.       
0c90: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
0ca0: 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _NE );.  assert(
0cb0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b   pExpr->pLeft );
0cc0: 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33  .  aff = sqlite3
0cd0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
0ce0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
0cf0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
0d00: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0d10: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0d20: 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ity(pExpr->pRigh
0d30: 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65  t, aff);.  }.  e
0d40: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
0d50: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61 66  Select ){.    af
0d60: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
0d70: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
0d80: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
0d90: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
0da0: 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  ff);.  }.  else 
0db0: 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20 20  if( !aff ){.    
0dc0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
0dd0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 7d 0a 20 20  _NUMERIC;.  }.  
0de0: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
0df0: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
0e00: 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65  comparison expre
0e10: 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20  ssion, eg. '=', 
0e20: 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63  '<', IN(...) etc
0e30: 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74  ..** idx_affinit
0e40: 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69 74  y is the affinit
0e50: 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20  y of an indexed 
0e60: 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74  column. Return t
0e70: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e  rue.** if the in
0e80: 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69 74  dex with affinit
0e90: 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d  y idx_affinity m
0ea0: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  ay be used to im
0eb0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63  plement.** the c
0ec0: 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78  omparison in pEx
0ed0: 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pr..*/.int sqlit
0ee0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
0ef0: 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63  k(Expr *pExpr, c
0f00: 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79  har idx_affinity
0f10: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  ){.  char aff = 
0f20: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
0f30: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69  ty(pExpr);.  swi
0f40: 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20  tch( aff ){.    
0f50: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
0f60: 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65 74 75  NONE:.      retu
0f70: 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53  rn 1;.    case S
0f80: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a  QLITE_AFF_TEXT:.
0f90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 64 78        return idx
0fa0: 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  _affinity==SQLIT
0fb0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
0fc0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
0fd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e  eturn sqlite3IsN
0fe0: 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 69  umericAffinity(i
0ff0: 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  dx_affinity);.  
1000: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1010: 6e 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 74  n the P1 value t
1020: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1030: 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20  ed for a binary 
1040: 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70  comparison.** op
1050: 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f  code (OP_Eq, OP_
1060: 47 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f  Ge etc.) used to
1070: 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20   compare pExpr1 
1080: 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49  and pExpr2..** I
1090: 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
10a0: 74 72 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74  true, then set t
10b0: 68 65 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74  he low byte of t
10c0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50  he returned.** P
10d0: 31 20 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20  1 value to tell 
10e0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75  the opcode to ju
10f0: 6d 70 20 69 66 20 65 69 74 68 65 72 20 65 78 70  mp if either exp
1100: 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75  ression.** evalu
1110: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f  ates to NULL..*/
1120: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61  .static int bina
1130: 72 79 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72  ryCompareP1(Expr
1140: 20 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a   *pExpr1, Expr *
1150: 70 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70  pExpr2, int jump
1160: 49 66 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20  IfNull){.  char 
1170: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70  aff = sqlite3Exp
1180: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32  rAffinity(pExpr2
1190: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e  );.  return ((in
11a0: 74 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  t)sqlite3Compare
11b0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c  Affinity(pExpr1,
11c0: 20 61 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75   aff))+(jumpIfNu
11d0: 6c 6c 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a  ll?0x100:0);.}..
11e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
11f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
1200: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1210: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1220: 75 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e  used by.** a bin
1230: 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  ary comparison o
1240: 70 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e  perator comparin
1250: 67 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  g pLeft and pRig
1260: 68 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ht..**.** If the
1270: 20 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72 65   left hand expre
1280: 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c  ssion has a coll
1290: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
12a0: 79 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a  ype, then it is.
12b0: 2a 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69  ** used. Otherwi
12c0: 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  se the collation
12d0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
12e0: 65 20 72 69 67 68 74 20 68 61 6e 64 20 65 78 70  e right hand exp
12f0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73  ression.** is us
1300: 65 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75  ed, or the defau
1310: 6c 74 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e  lt (BINARY) if n
1320: 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f  either expressio
1330: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1340: 67 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74  g.** type..*/.st
1350: 61 74 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69  atic CollSeq* bi
1360: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
1370: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
1380: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
1390: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
13a0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
13b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
13c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
13d0: 74 29 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c  t);.  if( !pColl
13e0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
13f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1400: 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  eq(pParse, pRigh
1410: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
1420: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pColl;.}../*.**
1430: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1440: 6f 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  or a comparison 
1450: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  operator..*/.sta
1460: 74 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70  tic int codeComp
1470: 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  are(.  Parse *pP
1480: 61 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  arse,    /* The 
1490: 70 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64  parsing (and cod
14a0: 65 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f  e generating) co
14b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
14c0: 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20  *pLeft,      /* 
14d0: 54 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  The left operand
14e0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
14f0: 68 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  ht,     /* The r
1500: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
1510: 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20    int opcode,   
1520: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61      /* The compa
1530: 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  rison opcode */.
1540: 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1550: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1560: 20 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20   if true.  */.  
1570: 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20  int jumpIfNull  
1580: 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75    /* If true, ju
1590: 6d 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65  mp if either ope
15a0: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  rand is NULL */.
15b0: 29 7b 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69  ){.  int p1 = bi
15c0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c  naryCompareP1(pL
15d0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
15e0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c  pIfNull);.  Coll
15f0: 53 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79  Seq *p3 = binary
1600: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
1610: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
1620: 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ight);.  return 
1630: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70  sqlite3VdbeOp3(p
1640: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70  Parse->pVdbe, op
1650: 63 6f 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20  code, p1, dest, 
1660: 28 76 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f  (void*)p3, P3_CO
1670: 4c 4c 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LLSEQ);.}../*.**
1680: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
1690: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
16a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
16b0: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65  inter to it.  Me
16c0: 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73  mory.** for this
16d0: 20 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65   node is obtaine
16e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
16f0: 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
1700: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
1710: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1720: 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  or making sure t
1730: 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c  he node eventual
1740: 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a  ly gets freed..*
1750: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
1760: 78 70 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72  xpr(int op, Expr
1770: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
1780: 52 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b  Right, const Tok
1790: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
17a0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  xpr *pNew;.  pNe
17b0: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
17c0: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29  ( sizeof(Expr) )
17d0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
17e0: 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ){.    /* When m
17f0: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c  alloc fails, del
1800: 65 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52  ete pLeft and pR
1810: 69 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e  ight. Expression
1820: 73 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20  s passed to .   
1830: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
1840: 6e 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  n must always be
1850: 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20   allocated with 
1860: 73 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f  sqlite3Expr() fo
1870: 72 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72  r this .    ** r
1880: 65 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20  eason. .    */. 
1890: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
18a0: 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20  lete(pLeft);.   
18b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18c0: 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20  te(pRight);.    
18d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
18e0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20  pNew->op = op;. 
18f0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70   pNew->pLeft = p
1900: 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  Left;.  pNew->pR
1910: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
1920: 20 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31   pNew->iAgg = -1
1930: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
1940: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
1950: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
1960: 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d      pNew->span =
1970: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a   pNew->token = *
1980: 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20  pToken;.  }else 
1990: 69 66 28 20 70 4c 65 66 74 20 26 26 20 70 52 69  if( pLeft && pRi
19a0: 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
19b0: 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c  e3ExprSpan(pNew,
19c0: 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26   &pLeft->span, &
19d0: 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20  pRight->span);. 
19e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
19f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
1a00: 64 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70  doing a nested p
1a10: 61 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e  arse, you can in
1a20: 63 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61  clude terms in a
1a30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
1a40: 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74  that look like t
1a50: 68 69 73 3a 20 20 20 23 30 20 23 31 20 23 32 20  his:   #0 #1 #2 
1a60: 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73  ...  These terms
1a70: 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e   refer to elemen
1a80: 74 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ts.** on the sta
1a90: 63 6b 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20  ck.  "#0" means 
1aa0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
1ab0: 74 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65  tack..** "#1" me
1ac0: 61 6e 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77  ans the next dow
1ad0: 6e 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  n on the stack. 
1ae0: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   And so forth..*
1af0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b00: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
1b10: 68 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61  he parser to dea
1b20: 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f  l with on of tho
1b30: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20  se terms..** It 
1b40: 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65  immediately gene
1b50: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74  rates code to st
1b60: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
1b70: 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69   a memory locati
1b80: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  on..** The retur
1b90: 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ns an expression
1ba0: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20   that will code 
1bb0: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
1bc0: 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61  alue from.** tha
1bd0: 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  t memory locatio
1be0: 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  n as needed..*/.
1bf0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67  Expr *sqlite3Reg
1c00: 69 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20  isterExpr(Parse 
1c10: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1c20: 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20  pToken){.  Vdbe 
1c30: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1c40: 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  be;.  Expr *p;. 
1c50: 20 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66   int depth;.  if
1c60: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
1c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1c80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c90: 65 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a  e, "near \"%T\":
1ca0: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20   syntax error", 
1cb0: 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74  pToken);.    ret
1cc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1cd0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
1ce0: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
1cf0: 78 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c  xpr(TK_REGISTER,
1d00: 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a   0, 0, pToken);.
1d10: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
1d20: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1d30: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
1d40: 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61  .  }.  depth = a
1d50: 74 6f 69 28 28 63 68 61 72 2a 29 26 70 54 6f 6b  toi((char*)&pTok
1d60: 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d 3e  en->z[1]);.  p->
1d70: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
1d80: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nMem++;.  sqlit
1d90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1da0: 50 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30 29  P_Dup, depth, 0)
1db0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1dc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
1dd0: 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c 20  ore, p->iTable, 
1de0: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  1);.  return p;.
1df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
1e00: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
1e10: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
1e20: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
1e30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
1e40: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
1e50: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
1e60: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
1e70: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1e80: 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c 65 66  prAnd(Expr *pLef
1e90: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
1ea0: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
1eb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1ec0: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
1ed0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
1ee0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
1ef0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1f00: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1f10: 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  r(TK_AND, pLeft,
1f20: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1f40: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
1f50: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
1f60: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
1f70: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
1f80: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
1f90: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
1fa0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
1fb0: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
1fc0: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
1fd0: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
1fe0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
1ff0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2000: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
2010: 28 20 21 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ( !sqlite3Malloc
2020: 46 61 69 6c 65 64 28 29 20 26 26 20 70 52 69 67  Failed() && pRig
2030: 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e  ht->z && pLeft->
2040: 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
2050: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c   pLeft->dyn==0 |
2060: 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74  | pLeft->z[pLeft
2070: 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->n]==0 );.    i
2080: 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30  f( pLeft->dyn==0
2090: 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d   && pRight->dyn=
20a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
20b0: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66  r->span.z = pLef
20c0: 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70  t->z;.      pExp
20d0: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67  r->span.n = pRig
20e0: 68 74 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d  ht->n + (pRight-
20f0: 3e 7a 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a  >z - pLeft->z);.
2100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2110: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d   pExpr->span.z =
2120: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
2130: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
2140: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2150: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e  n node for a fun
2160: 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69  ction with multi
2170: 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ple.** arguments
2180: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
2190: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45  e3ExprFunction(E
21a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
21b0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
21c0: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
21d0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29  assert( pToken )
21e0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
21f0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
2200: 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70  Expr) );.  if( p
2210: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
2220: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2230: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a 20 41  ete(pList); /* A
2240: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
2250: 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  ory when malloc 
2260: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
2270: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
2280: 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54  w->op = TK_FUNCT
2290: 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ION;.  pNew->pLi
22a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
22b0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
22c0: 6e 3d 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  n==0 );.  pNew->
22d0: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
22e0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20  .  pNew->span = 
22f0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72  pNew->token;.  r
2300: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
2310: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61  *.** Assign a va
2320: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f  riable number to
2330: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2340: 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69  hat encodes a wi
2350: 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65  ldcard.** in the
2360: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
2370: 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  atement.  .**.**
2380: 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69   Wildcards consi
2390: 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
23a0: 65 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e  e "?" are assign
23b0: 65 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  ed the next sequ
23c0: 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62  ential.** variab
23d0: 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  le number..**.**
23e0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
23f0: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72  e form "?nnn" ar
2400: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
2410: 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65  umber "nnn".  We
2420: 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e   make.** sure "n
2430: 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62  nn" is not too b
2440: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e  e to avoid a den
2450: 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61  ial of service a
2460: 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68  ttack when.** th
2470: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2480: 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78  comes from an ex
2490: 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a  ternal source..*
24a0: 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f  *.** Wildcards o
24b0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
24c0: 22 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  " or "$aaa" are 
24d0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
24e0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
24f0: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
2500: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
2510: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
2520: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2530: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
2540: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
2550: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2560: 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ial variable num
2570: 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e  ber is.** assign
2580: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2590: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
25a0: 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50  Number(Parse *pP
25b0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
25c0: 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f  r){.  Token *pTo
25d0: 6b 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ken;.  if( pExpr
25e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
25f0: 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d  pToken = &pExpr-
2600: 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74  >token;.  assert
2610: 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29  ( pToken->n>=1 )
2620: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
2630: 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73  en->z!=0 );.  as
2640: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  sert( pToken->z[
2650: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  0]!=0 );.  if( p
2660: 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20  Token->n==1 ){. 
2670: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f     /* Wildcard o
2680: 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20  f the form "?". 
2690: 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74   Assign the next
26a0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
26b0: 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   */.    pExpr->i
26c0: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
26d0: 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20  ->nVar;.  }else 
26e0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  if( pToken->z[0]
26f0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='?' ){.    /* 
2700: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
2710: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f  form "?nnn".  Co
2720: 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61  nvert "nnn" to a
2730: 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20  n integer and.  
2740: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
2750: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
2760: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  er */.    int i;
2770: 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  .    pExpr->iTab
2780: 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 28 63  le = i = atoi((c
2790: 68 61 72 2a 29 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  har*)&pToken->z[
27a0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  1]);.    if( i<1
27b0: 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58   || i>SQLITE_MAX
27c0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
27d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27f0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
2800: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
2810: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
2820: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2830: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
2840: 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  MBER);.    }.   
2850: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
2860: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
2870: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
2880: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2890: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
28a0: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
28b0: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
28c0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
28d0: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
28e0: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
28f0: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
2900: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
2910: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
2920: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
2930: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
2940: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
2950: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
2960: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
2970: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
2980: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
2990: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
29a0: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
29b0: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
29c0: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
29d0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
29e0: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
29f0: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
2a00: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
2a10: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
2a20: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
2a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2a40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
2a50: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
2a60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2a80: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
2a90: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
2aa0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
2ab0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
2ac0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
2ad0: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
2ae0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
2af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
2b00: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
2b10: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
2b20: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
2b30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 52  .        sqliteR
2b40: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f  eallocOrFree((vo
2b50: 69 64 2a 2a 29 26 70 50 61 72 73 65 2d 3e 61 70  id**)&pParse->ap
2b60: 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20  VarExpr,.       
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2b90: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61  Alloc*sizeof(pPa
2ba0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30  rse->apVarExpr[0
2bb0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ]) );.      }.  
2bc0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
2bd0: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
2be0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2bf0: 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  ( pParse->apVarE
2c00: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
2c10: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
2c20: 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72  xpr[pParse->nVar
2c30: 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b  Expr++] = pExpr;
2c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c50: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   } .}../*.** Rec
2c60: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
2c70: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
2c80: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
2c90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78  te3ExprDelete(Ex
2ca0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
2cb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
2cc0: 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29  f( p->span.dyn )
2cd0: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
2ce0: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  r*)p->span.z);. 
2cf0: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
2d00: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
2d10: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
2d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2d30: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29  Delete(p->pLeft)
2d40: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
2d50: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
2d60: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
2d70: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  istDelete(p->pLi
2d80: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
2d90: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
2da0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2db0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
2dc0: 2a 20 54 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  * The Expr.token
2dd0: 20 66 69 65 6c 64 20 6d 69 67 68 74 20 62 65 20   field might be 
2de0: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
2df0: 20 74 68 61 74 20 69 73 20 71 75 6f 74 65 64 2e   that is quoted.
2e00: 0a 2a 2a 20 49 66 20 73 6f 2c 20 72 65 6d 6f 76  .** If so, remov
2e10: 65 20 74 68 65 20 71 75 6f 74 61 74 69 6f 6e 20  e the quotation 
2e20: 6d 61 72 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  marks..*/.void s
2e30: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70  qlite3DequoteExp
2e40: 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  r(Expr *p){.  if
2e50: 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
2e60: 65 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f  erty(p, EP_Dequo
2e70: 74 65 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ted) ){.    retu
2e80: 72 6e 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53 65  rn;.  }.  ExprSe
2e90: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2ea0: 44 65 71 75 6f 74 65 64 29 3b 0a 20 20 69 66 28  Dequoted);.  if(
2eb0: 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30   p->token.dyn==0
2ec0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2ed0: 6f 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74 6f 6b  okenCopy(&p->tok
2ee0: 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29 3b 0a  en, &p->token);.
2ef0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
2f00: 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  uote((char*)p->t
2f10: 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  oken.z);.}.../*.
2f20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2f30: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
2f40: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
2f50: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
2f60: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
2f70: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
2f80: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
2f90: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
2fa0: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
2fb0: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
2fc0: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
2fd0: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
2fe0: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
2ff0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
3000: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
3010: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3030: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
3040: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
3050: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3060: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
3070: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
3080: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
3090: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
30a0: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
30b0: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
30c0: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
30d0: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
30e0: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
30f0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
3100: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
3110: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
3120: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
3130: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3140: 45 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29  ExprDup(Expr *p)
3150: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
3160: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3170: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3180: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3190: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
31a0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
31b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70  eturn 0;.  memcp
31c0: 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f  y(pNew, p, sizeo
31d0: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
31e0: 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29   p->token.z!=0 )
31f0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
3200: 6e 2e 7a 20 3d 20 28 75 38 2a 29 73 71 6c 69 74  n.z = (u8*)sqlit
3210: 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29  eStrNDup((char*)
3220: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74  p->token.z, p->t
3230: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65  oken.n);.    pNe
3240: 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31  w->token.dyn = 1
3250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3260: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b  ssert( pNew->tok
3270: 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  en.z==0 );.  }. 
3280: 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20   pNew->span.z = 
3290: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  0;.  pNew->pLeft
32a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
32b0: 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  p(p->pLeft);.  p
32c0: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
32d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
32e0: 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d  pRight);.  pNew-
32f0: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
3300: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
3310: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
3320: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
3330: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65  SelectDup(p->pSe
3340: 6c 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lect);.  pNew->p
3350: 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20  Tab = p->pTab;. 
3360: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3370: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65  void sqlite3Toke
3380: 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f  nCopy(Token *pTo
3390: 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b  , Token *pFrom){
33a0: 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20  .  if( pTo->dyn 
33b0: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
33c0: 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69  ar*)pTo->z);.  i
33d0: 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20  f( pFrom->z ){. 
33e0: 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f     pTo->n = pFro
33f0: 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a  m->n;.    pTo->z
3400: 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 53 74   = (u8*)sqliteSt
3410: 72 4e 44 75 70 28 28 63 68 61 72 2a 29 70 46 72  rNDup((char*)pFr
3420: 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29  om->z, pFrom->n)
3430: 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d  ;.    pTo->dyn =
3440: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3450: 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d   pTo->z = 0;.  }
3460: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
3470: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
3480: 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20  ExprList *p){.  
3490: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
34a0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
34b0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
34c0: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
34d0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
34e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
34f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3500: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
3510: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3520: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3530: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77  ew->nExpr = pNew
3540: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45  ->nAlloc = p->nE
3550: 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  xpr;.  pNew->a =
3560: 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d   pItem = sqliteM
3570: 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a  alloc( p->nExpr*
3580: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
3590: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
35a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  0 ){.    sqliteF
35b0: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72  ree(pNew);.    r
35c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
35d0: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
35e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
35f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
3600: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
3610: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
3620: 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72  wExpr, *pOldExpr
3630: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
3640: 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20  pr = pNewExpr = 
3650: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3660: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
3670: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
3680: 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70  if( pOldExpr->sp
3690: 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45  an.z!=0 && pNewE
36a0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  xpr ){.      /* 
36b0: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
36c0: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
36d0: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
36e0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
36f0: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
3700: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c  ion list.  The l
3710: 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70  ogic in SELECT p
3720: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64  rocessing that d
3730: 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20  etermines.      
3740: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
3750: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
3760: 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20  esult set needs 
3770: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
3780: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3790: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77  3TokenCopy(&pNew
37a0: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c  Expr->span, &pOl
37b0: 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  dExpr->span);.  
37c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
37d0: 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70  pNewExpr==0 || p
37e0: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21  NewExpr->span.z!
37f0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
3800: 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  || pOldExpr->spa
3810: 6e 2e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  n.z==0.         
3820: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c     || sqlite3Mal
3830: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20  locFailed() );. 
3840: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
3850: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3860: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
3870: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
3880: 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d  Order = pOldItem
3890: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
38a0: 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20   pItem->isAgg = 
38b0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b  pOldItem->isAgg;
38c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
38d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
38e0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
38f0: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
3900: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
3910: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
3920: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
3930: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
3940: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
3950: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
3960: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
3970: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
3980: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
3990: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
39a0: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
39b0: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
39c0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
39d0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
39e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
39f0: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
3a00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3a10: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
3a20: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3a30: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
3a40: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
3a50: 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73  rcListDup(SrcLis
3a60: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
3a70: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
3a80: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
3a90: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
3aa0: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
3ab0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
3ac0: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
3ad0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
3ae0: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
3af0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
3b00: 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a  ocRaw( nByte );.
3b10: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
3b20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3b30: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
3b40: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
3b50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
3b60: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
3b70: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3b80: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
3b90: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
3ba0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3bb0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
3bc0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
3bd0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
3be0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
3bf0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72  base = sqliteStr
3c00: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  Dup(pOldItem->zD
3c10: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
3c20: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
3c30: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
3c40: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
3c50: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
3c60: 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ias = sqliteStrD
3c70: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  up(pOldItem->zAl
3c80: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
3c90: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
3ca0: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
3cb0: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
3cc0: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
3cd0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
3ce0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 50 6f    pNewItem->isPo
3cf0: 70 75 6c 61 74 65 64 20 3d 20 70 4f 6c 64 49 74  pulated = pOldIt
3d00: 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3b  em->isPopulated;
3d10: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
3d20: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
3d30: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
3d40: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
3d50: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
3d60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
3d70: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
3d80: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
3d90: 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pOldItem->pSelec
3da0: 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  t);.    pNewItem
3db0: 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ->pOn = sqlite3E
3dc0: 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  xprDup(pOldItem-
3dd0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49  >pOn);.    pNewI
3de0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
3df0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70  lite3IdListDup(p
3e00: 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  OldItem->pUsing)
3e10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3e20: 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74  colUsed = pOldIt
3e30: 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d  em->colUsed;.  }
3e40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3e50: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
3e60: 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73  3IdListDup(IdLis
3e70: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
3e80: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
3e90: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3ea0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3eb0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3ec0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
3ed0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3ee0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3ef0: 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e  ew->nId = pNew->
3f00: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b  nAlloc = p->nId;
3f10: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
3f20: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d  iteMallocRaw( p-
3f30: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
3f40: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
3f50: 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ew->a==0 ){.    
3f60: 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29  sqliteFree(pNew)
3f70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
3f80: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
3f90: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
3fa0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3fb0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
3fc0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
3fd0: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3fe0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
3ff0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
4000: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
4010: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
4020: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
4030: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
4040: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
4050: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
4060: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
4070: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4080: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
4090: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
40a0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
40b0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
40c0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
40d0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
40e0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
40f0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
4100: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
4110: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
4120: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
4130: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
4140: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
4150: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
4160: 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70  3SrcListDup(p->p
4170: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
4180: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
4190: 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29  prDup(p->pWhere)
41a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
41b0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
41c0: 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75  ListDup(p->pGrou
41d0: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
41e0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
41f0: 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e  xprDup(p->pHavin
4200: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
4210: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
4220: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72  prListDup(p->pOr
4230: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
4240: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
4250: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
4260: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
4270: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77  >pPrior);.  pNew
4280: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
4290: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69  e3ExprDup(p->pLi
42a0: 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  mit);.  pNew->pO
42b0: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
42c0: 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65  xprDup(p->pOffse
42d0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
42e0: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
42f0: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
4300: 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65   pNew->isResolve
4310: 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  d = p->isResolve
4320: 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  d;.  pNew->isAgg
4330: 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70   = p->isAgg;.  p
4340: 4e 65 77 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20  New->usesEphm = 
4350: 30 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c  0;.  pNew->disal
4360: 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  lowOrderBy = 0;.
4370: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
4380: 73 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  st = 0;.  pNew->
4390: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
43a0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
43b0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
43c0: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
43d0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
43e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
43f0: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
4400: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
4410: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
4420: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
4430: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4440: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
4450: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
4460: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
4470: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4480: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
4490: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
44a0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
44b0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
44c0: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
44d0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
44e0: 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20  Append(ExprList 
44f0: 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45  *pList, Expr *pE
4500: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  xpr, Token *pNam
4510: 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  e){.  if( pList=
4520: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
4530: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4540: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
4550: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
4560: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
4570: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
4580: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
4590: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b  st->nAlloc==0 );
45a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
45b0: 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d  ->nAlloc<=pList-
45c0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74  >nExpr ){.    st
45d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
45e0: 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e  em *a;.    int n
45f0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
4600: 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20  *2 + 4;.    a = 
4610: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
4620: 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66  ist->a, n*sizeof
4630: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
4640: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
4650: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
4660: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
4670: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70  st->a = a;.    p
4680: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e  List->nAlloc = n
4690: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
46a0: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
46b0: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
46c0: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
46d0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
46e0: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
46f0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
4700: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
4710: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
4720: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
4730: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
4740: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4750: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  n(pName);.    pI
4760: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
4770: 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pr;.  }.  return
4780: 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a   pList;..no_mem:
4790: 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64       .  /* Avoid
47a0: 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20   leaking memory 
47b0: 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61  if malloc has fa
47c0: 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  iled. */.  sqlit
47d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
47e0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
47f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
4800: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  st);.  return 0;
4810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
4820: 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65   an entire expre
4830: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76  ssion list..*/.v
4840: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
4850: 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69  istDelete(ExprLi
4860: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
4870: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
4880: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
4890: 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
48a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
48b0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
48c0: 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45  =0 || (pList->nE
48d0: 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d  xpr==0 && pList-
48e0: 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20  >nAlloc==0) );. 
48f0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
4900: 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41  nExpr<=pList->nA
4910: 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49  lloc );.  for(pI
4920: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
4930: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
4940: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
4950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4960: 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70  rDelete(pItem->p
4970: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
4980: 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  eFree(pItem->zNa
4990: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
49a0: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
49b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
49c0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ist);.}../*.** W
49d0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
49e0: 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46  n tree.  Call xF
49f0: 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64  unc for each nod
4a00: 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  e visited..**.**
4a10: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
4a20: 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74  e from xFunc det
4a30: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
4a40: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
4a50: 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65  ntinues..** 0 me
4a60: 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c  ans continue wal
4a70: 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20  king the tree.  
4a80: 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77  1 means do not w
4a90: 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20  alk children.** 
4aa0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  of the current n
4ab0: 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  ode but continue
4ac0: 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20   with siblings. 
4ad0: 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e   2 means abandon
4ae0: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c  .** the tree wal
4af0: 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a  k completely..**
4b00: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
4b10: 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72  alue from this r
4b20: 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61  outine is 1 to a
4b30: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
4b40: 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f  walk.** and 0 to
4b50: 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
4b60: 20 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72   NOTICE:  This r
4b70: 6f 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74  outine does *not
4b80: 2a 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73  * descend into s
4b90: 75 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74  ubqueries..*/.st
4ba0: 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70  atic int walkExp
4bb0: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
4bc0: 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a  , int (*)(void *
4bd0: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
4be0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  );.static int wa
4bf0: 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20  lkExprTree(Expr 
4c00: 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46  *pExpr, int (*xF
4c10: 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a  unc)(void*,Expr*
4c20: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
4c30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
4c40: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
4c50: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46  n 0;.  rc = (*xF
4c60: 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72  unc)(pArg, pExpr
4c70: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
4c80: 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  {.    if( walkEx
4c90: 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c  prTree(pExpr->pL
4ca0: 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  eft, xFunc, pArg
4cb0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
4cc0: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
4cd0: 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ee(pExpr->pRight
4ce0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
4cf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
4d00: 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  f( walkExprList(
4d10: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46  pExpr->pList, xF
4d20: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4d30: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
4d40: 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  urn rc>1;.}../*.
4d50: 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72  ** Call walkExpr
4d60: 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79  Tree() for every
4d70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c   expression in l
4d80: 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ist p..*/.static
4d90: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
4da0: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  t(ExprList *p, i
4db0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
4dc0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
4dd0: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69   *pArg){.  int i
4de0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
4df0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
4e00: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
4e10: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  rn 0;.  for(i=p-
4e20: 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
4e30: 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
4e40: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
4e50: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74  walkExprTree(pIt
4e60: 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63  em->pExpr, xFunc
4e70: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
4e80: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4e90: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c   0;.}../*.** Cal
4ea0: 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  l walkExprTree()
4eb0: 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
4ec0: 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20  ssion in Select 
4ed0: 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  p, not including
4ee0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
4ef0: 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66  that are part of
4f00: 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20   sub-selects in 
4f10: 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  any FROM clause 
4f20: 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20  or the LIMIT.** 
4f30: 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73  or OFFSET expres
4f40: 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69  sions...*/.stati
4f50: 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74  c int walkSelect
4f60: 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20  Expr(Select *p, 
4f70: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
4f80: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
4f90: 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b  d *pArg){.  walk
4fa0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
4fb0: 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  st, xFunc, pArg)
4fc0: 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65  ;.  walkExprTree
4fd0: 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e  (p->pWhere, xFun
4fe0: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
4ff0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
5000: 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  upBy, xFunc, pAr
5010: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  g);.  walkExprTr
5020: 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78  ee(p->pHaving, x
5030: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
5040: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  alkExprList(p->p
5050: 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20  OrderBy, xFunc, 
5060: 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  pArg);.  return 
5070: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0;.}.../*.** Thi
5080: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
5090: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
50a0: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
50b0: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67  ee()..**.** pArg
50c0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
50d0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
50e0: 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74  er.  If we can t
50f0: 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a  ell by looking.*
5100: 2a 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20  * at pExpr that 
5110: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
5120: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78  hat contains pEx
5130: 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  pr is not a cons
5140: 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69  tant.** expressi
5150: 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41  on, then set *pA
5160: 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  rg to 0 and retu
5170: 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20  rn 2 to abandon 
5180: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
5190: 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20  * If pExpr does 
51a0: 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c  does not disqual
51b0: 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
51c0: 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20  on from being a 
51d0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e  constant.** then
51e0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   do nothing..**.
51f0: 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67  ** After walking
5200: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c   the whole tree,
5210: 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65   if no nodes are
5220: 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71   found that disq
5230: 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78  ualify.** the ex
5240: 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73  pression as cons
5250: 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73  tant, then we as
5260: 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65  sume the whole e
5270: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
5280: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73  constant.  See s
5290: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
52a0: 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74  tant() for addit
52b0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
52c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
52d0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
52e0: 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ant(void *pArg, 
52f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
5300: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
5310: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  p ){.    /* Cons
5320: 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ider functions t
5330: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66  o be constant if
5340: 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d   all their argum
5350: 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  ents are constan
5360: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41  t.    ** and *pA
5370: 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73  rg==2 */.    cas
5380: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
5390: 20 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74 2a       if( *((int*
53a0: 29 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74 75  )pArg)==2 ) retu
53b0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46  rn 0;.      /* F
53c0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
53d0: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
53e0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
53f0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
5400: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
5410: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
5420: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
5430: 4c 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51  LUMN:.#ifndef SQ
5440: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5450: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
5460: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
5470: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
5480: 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29  f.      *((int*)
5490: 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20  pArg) = 0;.     
54a0: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63   return 2;.    c
54b0: 61 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20  ase TK_IN:.     
54c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
54d0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ect ){.        *
54e0: 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30  ((int*)pArg) = 0
54f0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
5500: 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   2;.      }.    
5510: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
5520: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
5530: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
5540: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5550: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
5560: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
5570: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
5580: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
5590: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
55a0: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
55b0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
55c0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
55d0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
55e0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
55f0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
5600: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
5610: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
5620: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
5630: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
5640: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
5650: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
5660: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
5670: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5680: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
5690: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
56a0: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
56b0: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
56c0: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
56d0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
56e0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
56f0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
5700: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
5710: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
5720: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
5730: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
5740: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
5750: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
5760: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
5770: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
5780: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
5790: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
57a0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
57b0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
57c0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
57d0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
57e0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
57f0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
5800: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
5810: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5820: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
5830: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
5840: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
5850: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
5860: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
5870: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
5880: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
5890: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
58a0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
58b0: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
58c0: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
58d0: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
58e0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
58f0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
5900: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
5910: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
5920: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
5930: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
5940: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5950: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
5960: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
5970: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
5980: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
5990: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
59a0: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
59b0: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
59c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
59d0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
59e0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
59f0: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
5a00: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
5a10: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
5a20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5a30: 33 47 65 74 49 6e 74 33 32 28 28 63 68 61 72 2a  3GetInt32((char*
5a40: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61  )p->token.z, pVa
5a50: 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lue) ){.        
5a60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5a70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5a80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5a90: 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20  _UPLUS: {.      
5aa0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
5ab0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
5ac0: 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
5ad0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5ae0: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
5af0: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
5b00: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
5b10: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
5b20: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
5b30: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
5b40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
5b70: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
5b80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
5b90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
5ba0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
5bb0: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
5bc0: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
5bd0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
5be0: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
5bf0: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
5c00: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
5c10: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
5c20: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
5c30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
5c40: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
5c50: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
5c60: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
5c70: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
5c80: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
5c90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
5ca0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
5cb0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f  column of the fo
5cc0: 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  rm X.Y.Z or Y.Z 
5cd0: 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20  or just Z, look 
5ce0: 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20  up.** that name 
5cf0: 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f  in the set of so
5d00: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70  urce tables in p
5d10: 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65  SrcList and make
5d20: 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65   the pExpr .** e
5d30: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
5d40: 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61  efer back to tha
5d50: 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e  t source column.
5d60: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
5d70: 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d  changes.** are m
5d80: 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a  ade to pExpr:.**
5d90: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44  .**    pExpr->iD
5da0: 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20  b           Set 
5db0: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d  the index in db-
5dc0: 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61  >aDb[] of the da
5dd0: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a  tabase holding.*
5de0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5df0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61            the ta
5e00: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
5e10: 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20  ->iTable        
5e20: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f  Set to the curso
5e30: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
5e40: 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a   table obtained.
5e50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
5e60: 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
5e70: 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20  pSrcList..**    
5e80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20  pExpr->iColumn  
5e90: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
5ea0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
5eb0: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  thin the table..
5ec0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  **    pExpr->op 
5ed0: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
5ee0: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20  o TK_COLUMN..** 
5ef0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
5f00: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
5f10: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
5f20: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
5f30: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .**    pExpr->pR
5f40: 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20  ight        Any 
5f50: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
5f60: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
5f70: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
5f80: 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20  pDbToken is the 
5f90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
5fa0: 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20  base (the "X"). 
5fb0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
5fc0: 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69  be.** NULL meani
5fd0: 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20  ng that name is 
5fe0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20  of the form Y.Z 
5ff0: 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c  or Z.  Any avail
6000: 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  able database.**
6010: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54   can be used.  T
6020: 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69  he pTableToken i
6030: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
6040: 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22  e table (the "Y"
6050: 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75  ).  This.** valu
6060: 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66  e can be NULL if
6070: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73   pDbToken is als
6080: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62  o NULL.  If pTab
6090: 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20  leToken is NULL 
60a0: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  it.** means that
60b0: 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65   the form of the
60c0: 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74   name is Z and t
60d0: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  hat columns from
60e0: 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61   any table.** ca
60f0: 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  n be used..**.**
6100: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e   If the name can
6110: 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20  not be resolved 
6120: 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c  unambiguously, l
6130: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
6140: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
6150: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
6160: 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  n-zero.  Return 
6170: 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e  zero on success.
6180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
6190: 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72  ookupName(.  Par
61a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
61b0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
61c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
61d0: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
61e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
61f0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
6200: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
6210: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
6220: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
6230: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
6240: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
6250: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
6260: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
6270: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
6280: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
6290: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
62a0: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
62b0: 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74  e context used t
62c0: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61  o resolve the na
62d0: 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  me */.  Expr *pE
62e0: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
62f0: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
6300: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
6310: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
6320: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
6330: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
6340: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
6350: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
6360: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
6370: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
6380: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6390: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
63a0: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
63b0: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
63c0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
63d0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
63e0: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
63f0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
6400: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
6410: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
6420: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
6430: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
6440: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
6450: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  mes */.  int cnt
6460: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
6470: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
6480: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
6490: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
64a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
64b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
64c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
64d0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
64e0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f         /* Use fo
64f0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
6500: 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f  SrcList items */
6510: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
6520: 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d  t_item *pMatch =
6530: 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63   0;  /* The matc
6540: 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74  hing pSrcList it
6550: 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  em */.  NameCont
6560: 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e  ext *pTopNC = pN
6570: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  C;        /* Fir
6580: 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69  st namecontext i
6590: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20  n the list */.. 
65a0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
65b0: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
65c0: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
65d0: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
65e0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
65f0: 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e    zDb = sqlite3N
6600: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62  ameFromToken(pDb
6610: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d  Token);.  zTab =
6620: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
6630: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65  Token(pTableToke
6640: 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c  n);.  zCol = sql
6650: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
6660: 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b  n(pColumnToken);
6670: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
6680: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
6690: 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e      goto lookupn
66a0: 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ame_end;.  }..  
66b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
66c0: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43  -1;.  while( pNC
66d0: 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   && cnt==0 ){.  
66e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
66f0: 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  st;.    SrcList 
6700: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
6710: 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20  >pSrcList;..    
6720: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
6730: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
6740: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
6750: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
6760: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
6770: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
6780: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20   *pTab;.        
6790: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
67a0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
67b0: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d   .        pTab =
67c0: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
67d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
67e0: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ab!=0 );.       
67f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
6800: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
6810: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
6820: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6830: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
6840: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
6850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6860: 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
6870: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
6880: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
6890: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pItem->zAlias;. 
68a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
68b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
68c0: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
68d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
68e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
68f0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
6900: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
6910: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
6920: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
6930: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
6940: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
6950: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
6960: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
6970: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
6980: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
6990: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
69a0: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
69b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
69c0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
69d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
69e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69f0: 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b   if( 0==(cntTab+
6a00: 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
6a10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
6a20: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
6a30: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6a40: 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d  >pSchema = pTab-
6a50: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
6a60: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
6a70: 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  em;.        }.  
6a80: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
6a90: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
6aa0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
6ab0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
6ac0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6ad0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
6ae0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
6af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
6b00: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20  nst char *zColl 
6b10: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
6b20: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  zColl;.         
6b30: 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e     IdList *pUsin
6b40: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  g;.            c
6b50: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
6b60: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6b70: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
6b80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
6b90: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
6ba0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6bb0: 3e 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d  >pSchema = pTab-
6bc0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
6bd0: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
6be0: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
6bf0: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
6c00: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
6c10: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
6c20: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6c30: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
6c40: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
6c50: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6c60: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
6c70: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
6c80: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
6c90: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
6ca0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
6cb0: 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
6cc0: 7a 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20  zColl,-1, 0);.  
6cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
6ce0: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
6cf0: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20  JT_NATURAL ){.  
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6d10: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
6d20: 75 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66  urred in the lef
6d30: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74  t table of a nat
6d40: 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20  ural join,.     
6d50: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e           ** then
6d60: 20 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20   skip the right 
6d70: 74 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61  table to avoid a
6d80: 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68   duplicate match
6d90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6da0: 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20    pItem++;.     
6db0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
6dc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6dd0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 55 73          if( (pUs
6de0: 69 6e 67 20 3d 20 70 49 74 65 6d 2d 3e 70 55 73  ing = pItem->pUs
6df0: 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ing)!=0 ){.     
6e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
6e10: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73  his match occurs
6e20: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61   on a column tha
6e30: 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e  t is in the USIN
6e40: 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  G clause.       
6e50: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a         ** of a j
6e60: 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65  oin, skip the se
6e70: 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68  arch of the righ
6e80: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
6e90: 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  oin.            
6ea0: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20    ** to avoid a 
6eb0: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
6ec0: 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20  there. */.      
6ed0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
6ef0: 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e  (k=0; k<pUsing->
6f00: 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  nId; k++){.     
6f10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
6f20: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55  qlite3StrICmp(pU
6f30: 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65  sing->a[k].zName
6f40: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f60: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
6f70: 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a             i++;.
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6fa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6fd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ff0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7000: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7010: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
7020: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e   /* If we have n
7030: 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c  ot already resol
7040: 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68  ved the name, th
7050: 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a  en maybe .    **
7060: 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f   it is a new.* o
7070: 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20  r old.* trigger 
7080: 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e  argument referen
7090: 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ce.    */.    if
70a0: 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62  ( zDb==0 && zTab
70b0: 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26  !=0 && cnt==0 &&
70c0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
70d0: 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ck!=0 ){.      T
70e0: 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72  riggerStack *pTr
70f0: 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61  iggerStack = pPa
7100: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a  rse->trigStack;.
7110: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
7120: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  b = 0;.      if(
7130: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
7140: 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20  newIdx != -1 && 
7150: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
7160: 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30  new", zTab) == 0
7170: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
7180: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
7190: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64  ggerStack->newId
71a0: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
71b0: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
71c0: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
71d0: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
71e0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
71f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
7200: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
7210: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
7220: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64  ite3StrICmp("old
7230: 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20  ", zTab)==0 ){. 
7240: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
7250: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
7260: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20  tack->oldIdx;.  
7270: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
7280: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
7290: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  b );.        pTa
72a0: 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  b = pTriggerStac
72b0: 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d  k->pTab;.      }
72c0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
72d0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74   ){ .        int
72e0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 43   iCol;.        C
72f0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54  olumn *pCol = pT
7300: 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20  ab->aCol;..     
7310: 20 20 20 70 45 78 70 72 2d 3e 70 53 63 68 65 6d     pExpr->pSchem
7320: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
7330: 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61  a;.        cntTa
7340: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  b++;.        for
7350: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c 20  (iCol=0; iCol < 
7360: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
7370: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
7380: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7390: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
73a0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
73b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
73c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
73d0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
73e0: 43 6f 6c 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col].zColl;.    
73f0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
7400: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7410: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
7420: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
7430: 2d 31 20 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20  -1 : iCol;.     
7440: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
7450: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
7460: 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69  Col[iCol].affini
7470: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
7480: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
7490: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
74a0: 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
74b0: 43 6f 6c 6c 2c 2d 31 2c 20 30 29 3b 0a 20 20 20  Coll,-1, 0);.   
74c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
74d0: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
74e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
74f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7500: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7510: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
7520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7530: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a  IT_TRIGGER) */..
7540: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65      /*.    ** Pe
7550: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
7560: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
7570: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a   the ROWID.    *
7580: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
7590: 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26   && cntTab==1 &&
75a0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
75b0: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63  zCol) ){.      c
75c0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45  nt = 1;.      pE
75d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
75e0: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
75f0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
7600: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
7610: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
7620: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
7630: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
7640: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
7650: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
7660: 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68  me Z.    ** migh
7670: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
7680: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
7690: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
76a0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
76b0: 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72  .    ** we are r
76c0: 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69  esolving names i
76d0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
76e0: 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
76f0: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20  ing command:.   
7700: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
7710: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46  ELECT a+b AS x F
7720: 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20  ROM table WHERE 
7730: 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  x<10;.    **.   
7740: 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b   ** In cases lik
7750: 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20  e this, replace 
7760: 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70  pExpr with a cop
7770: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
7780: 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ion that.    ** 
7790: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
77a0: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
77b0: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
77c0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
77d0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
77e0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
77f0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
7800: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
7810: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
7820: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f  been.    ** reso
7830: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
7840: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
7850: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
7860: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
7870: 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20  t==0 && (pEList 
7880: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d  = pNC->pEList)!=
7890: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a  0 && zTab==0 ){.
78a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
78b0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
78c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
78d0: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
78e0: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
78f0: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
7900: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
7910: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
7920: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
7930: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
7940: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
7950: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
7960: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
7970: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
7980: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
7990: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
79a0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
79b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
79c0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
79d0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  pr);.          c
79e0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
79f0: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
7a00: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
7a10: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
7a20: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a  okupname_end_2;.
7a30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7a40: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
7a50: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
7a60: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
7a70: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
7a80: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
7a90: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
7aa0: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
7ab0: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
7ac0: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
7ad0: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
7ae0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
7af0: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
7b00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
7b10: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
7b20: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
7b30: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
7b40: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
7b50: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
7b60: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
7b70: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
7b80: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
7b90: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
7ba0: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
7bb0: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
7bc0: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
7bd0: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
7be0: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
7bf0: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
7c00: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
7c10: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
7c20: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
7c30: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
7c40: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
7c50: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
7c60: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
7c70: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
7c80: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
7c90: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
7ca0: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
7cb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
7cc0: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
7cd0: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
7ce0: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
7cf0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
7d00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7d10: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
7d20: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
7d30: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
7d40: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
7d50: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
7d60: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
7d70: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
7d80: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
7d90: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
7da0: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72  t!=1 ){.    char
7db0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61   *z = 0;.    cha
7dc0: 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72  r *zErr;.    zEr
7dd0: 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f  r = cnt==0 ? "no
7de0: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73   such column: %s
7df0: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
7e00: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b  olumn name: %s";
7e10: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
7e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
7e30: 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20  String(&z, zDb, 
7e40: 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  ".", zTab, ".", 
7e50: 7a 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b  zCol, (char*)0);
7e60: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
7e70: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
7e80: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7e90: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
7ea0: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
7eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
7ec0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
7ed0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
7ee0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7ef0: 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a  (pParse, zErr, z
7f00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
7f10: 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43  e(z);.    pTopNC
7f20: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nErr++;.  }.. 
7f30: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
7f40: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20  from a table in 
7f50: 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65  pSrcList is refe
7f60: 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63  renced, then rec
7f70: 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ord.  ** this fa
7f80: 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69  ct in the pSrcLi
7f90: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62  st.a[].colUsed b
7fa0: 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20  itmask.  Column 
7fb0: 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69  0 causes.  ** bi
7fc0: 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20  t 0 to be set.  
7fd0: 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69  Column 1 sets bi
7fe0: 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  t 1.  And so for
7ff0: 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  th.  If the.  **
8000: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
8010: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
8020: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
8030: 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  s in the bitmask
8040: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74  .  ** then set t
8050: 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
8060: 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  t of the bitmask
8070: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
8080: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
8090: 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20  & pMatch!=0 ){. 
80a0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
80b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->iColumn;.    i
80c0: 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74  f( n>=sizeof(Bit
80d0: 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20  mask)*8 ){.     
80e0: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d   n = sizeof(Bitm
80f0: 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a  ask)*8-1;.    }.
8100: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74      assert( pMat
8110: 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78  ch->iCursor==pEx
8120: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
8130: 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65    pMatch->colUse
8140: 64 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a  d |= 1<<n;.  }..
8150: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a  lookupname_end:.
8160: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
8170: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
8180: 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b  sqliteFree(zDb);
8190: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
81a0: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ab);.  sqlite3Ex
81b0: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
81c0: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
81d0: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
81e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
81f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
8200: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
8210: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
8220: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f   = TK_COLUMN;.lo
8230: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a  okupname_end_2:.
8240: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
8250: 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31  l);.  if( cnt==1
8260: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8270: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  pNC!=0 );.    sq
8280: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
8290: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e 43  arse, pExpr, pNC
82a0: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
82b0: 20 69 66 28 20 70 4d 61 74 63 68 20 26 26 20 21   if( pMatch && !
82c0: 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65 63 74 20  pMatch->pSelect 
82d0: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
82e0: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
82f0: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  Tab;.    }.    /
8300: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
8310: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
8320: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
8330: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
8340: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
8350: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
8360: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
8370: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
8380: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
8390: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
83a0: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
83b0: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
83c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
83d0: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
83e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
83f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
8400: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
8410: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
8420: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8430: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
8440: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
8450: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
8460: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
8470: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
8480: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
8490: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
84a0: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
84b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
84c0: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
84d0: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
84e0: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
84f0: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
8500: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
8510: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8520: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
8530: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
8540: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
8550: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
8560: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
8570: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
8580: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
8590: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
85a0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
85b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
85c0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
85d0: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
85e0: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
85f0: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
8600: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
8610: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8620: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
8630: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
8640: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
8650: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
8660: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
8670: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
8680: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
8690: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
86a0: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
86b0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
86c0: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
86d0: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
86e0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
86f0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
8700: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
8710: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
8720: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
8730: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
8740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
8750: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
8760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
8770: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
8780: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
8790: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
87a0: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
87b0: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
87c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
87d0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
87e0: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
87f0: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
8800: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
8810: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
8820: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
8830: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
8840: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
8850: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
8860: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
8870: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
8880: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
8890: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
88a0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
88b0: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
88c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
88d0: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
88e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
88f0: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
8900: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
8910: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
8920: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
8930: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
8940: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
8950: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
8960: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
8970: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
8980: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
8990: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
89a0: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
89b0: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
89c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
89d0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
89e0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
89f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
8a00: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
8a10: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
8a20: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
8a30: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
8a40: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
8a50: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
8a60: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
8a70: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
8a80: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
8a90: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
8aa0: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
8ab0: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
8ac0: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
8ad0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
8ae0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
8af0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
8b00: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
8b10: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
8b20: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
8b30: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
8b40: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
8b50: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
8b60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8b70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
8b80: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
8b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
8ba0: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
8bb0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8bc0: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
8bd0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
8be0: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
8bf0: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
8c00: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
8c10: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
8c20: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
8c30: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
8c40: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
8c50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8c60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
8c70: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
8c80: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
8c90: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
8ca0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
8cb0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
8cc0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8cd0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
8ce0: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
8cf0: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
8d00: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
8d10: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
8d20: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
8d30: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8d40: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
8d50: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
8d60: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
8d70: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
8d80: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
8d90: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
8da0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8db0: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
8dc0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8dd0: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
8de0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8df0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
8e00: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
8e10: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
8e20: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
8e30: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
8e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8e50: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
8e60: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
8e70: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
8e80: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
8e90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
8ea0: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
8eb0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
8ec0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
8ed0: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
8ee0: 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69  about the functi
8ef0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
8f00: 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
8f10: 2d 3e 64 62 29 3b 20 20 2f 2a 20 54 68 65 20 64  ->db);  /* The d
8f20: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
8f30: 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d   */..      zId =
8f40: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
8f50: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
8f60: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
8f70: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
8f80: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
8f90: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
8fa0: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e   zId, nId, n, en
8fb0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  c, 0);.      if(
8fc0: 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pDef==0 ){.    
8fd0: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
8fe0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
8ff0: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
9000: 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29  nId, -1, enc, 0)
9010: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
9020: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
9030: 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20     no_such_func 
9040: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
9050: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72  se{.          wr
9060: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31  ong_num_args = 1
9070: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9090: 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e   is_agg = pDef->
90a0: 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20  xFunc==0;.      
90b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
90c0: 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f  gg && !pNC->allo
90d0: 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  wAgg ){.        
90e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
90f0: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
9100: 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
9110: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e  ction %.*s()", n
9120: 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  Id,zId);.       
9130: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
9140: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
9150: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9160: 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29  ( no_such_func )
9170: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9180: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9190: 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  , "no such funct
91a0: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c  ion: %.*s", nId,
91b0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
91c0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
91d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e    }else if( wron
91e0: 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20  g_num_args ){.  
91f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9200: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72  orMsg(pParse,"wr
9210: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
9220: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
9230: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20  ion %.*s()",.   
9240: 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a            nId, z
9250: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
9260: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
9270: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
9280: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  gg ){.        pE
9290: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
92a0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
92b0: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
92c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
92d0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
92e0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  NC->allowAgg = 0
92f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9300: 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26   pNC->nErr==0 &&
9310: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
9320: 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65      walkExprTree
9330: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
9340: 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  pr, nameResolver
9350: 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20  Step, pNC);.    
9360: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
9370: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
9380: 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  wAgg = 1;.      
9390: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70  /* FIX ME:  Comp
93a0: 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ute pExpr->affin
93b0: 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ity based on the
93c0: 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e   expected return
93d0: 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f  .      ** type o
93e0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a  f the function .
93f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
9400: 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20  eturn is_agg;.  
9410: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9420: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9430: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
9440: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
9450: 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a  _EXISTS:.#endif.
9460: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
9470: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
9480: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
9490: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d        int nRef =
94a0: 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e   pNC->nRef;.#ifn
94b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
94c0: 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20 69 66  CHECK.        if
94d0: 28 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29  ( pNC->isCheck )
94e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
94f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9500: 73 65 2c 22 73 75 62 71 75 65 72 69 65 73 20 70  se,"subqueries p
9510: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45  rohibited in CHE
9520: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  CK constraints")
9530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
9540: 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  if.        sqlit
9550: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
9560: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9570: 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20  Select, pNC);.  
9580: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
9590: 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b  C->nRef>=nRef );
95a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65  .        if( nRe
95b0: 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a  f!=pNC->nRef ){.
95c0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
95d0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
95e0: 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a   EP_VarSelect);.
95f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9600: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9610: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
9620: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
9630: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
9640: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  BLE: {.      if(
9650: 20 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b   pNC->isCheck ){
9660: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9670: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9680: 22 70 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68  "parameters proh
9690: 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20  ibited in CHECK 
96a0: 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20  constraints");. 
96b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
96c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
96d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
96e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
96f0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
9700: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
9710: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
9720: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
9730: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f  ble columns.  No
9740: 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  des of the form 
9750: 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f  ID.ID or ID reso
9760: 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69  lve into an.** i
9770: 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c  ndex to the tabl
9780: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
9790: 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e  ist and a column
97a0: 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a   offset.  The .*
97b0: 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f  * Expr.opcode fo
97c0: 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20  r such nodes is 
97d0: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
97e0: 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e  LUMN.  The Expr.
97f0: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
9800: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
9810: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  e index of the r
9820: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
9830: 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70  in pTabList.** p
9840: 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76  lus the "base" v
9850: 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20  alue.  The base 
9860: 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d  value will ultim
9870: 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65  ately become the
9880: 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20  .** VDBE cursor 
9890: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72  number for a cur
98a0: 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
98b0: 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65  ting into the re
98c0: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c  ferenced.** tabl
98d0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
98e0: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68  lumn value is ch
98f0: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
9900: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
9910: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65   .** of the refe
9920: 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54  renced table.  T
9930: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
9940: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70  value for the sp
9950: 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63  ecial.** ROWID c
9960: 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e  olumn is -1.  An
9970: 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  y INTEGER PRIMAR
9980: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20  Y KEY column is 
9990: 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61  tried as an.** a
99a0: 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a  lias for ROWID..
99b0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f 6c  **.** Also resol
99c0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
99d0: 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65 20  s and check the 
99e0: 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70 72  functions for pr
99f0: 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20 20  oper.** usage.  
9a00: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66 75  Make sure all fu
9a10: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65  nction names are
9a20: 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
9a30: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  all functions.**
9a40: 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65 63   have the correc
9a50: 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  t number of argu
9a60: 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e  ments.  Leave an
9a70: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
9a80: 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  * in pParse->zEr
9a90: 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e 67  rMsg if anything
9aa0: 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75   is amiss.  Retu
9ab0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9ac0: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
9ad0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67   contains aggreg
9af0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ate functions th
9b00: 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41 67  en set the EP_Ag
9b10: 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e  g.** property on
9b20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
9b30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
9b40: 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
9b50: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
9b60: 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61  pNC,       /* Na
9b70: 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c  mespace to resol
9b80: 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ve expressions i
9b90: 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  n. */.  Expr *pE
9ba0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
9bb0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
9bc0: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
9bd0: 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61  . */.){.  int sa
9be0: 76 65 64 48 61 73 41 67 67 3b 0a 20 20 69 66 28  vedHasAgg;.  if(
9bf0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
9c00: 72 6e 20 30 3b 0a 20 20 73 61 76 65 64 48 61 73  rn 0;.  savedHas
9c10: 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41 67  Agg = pNC->hasAg
9c20: 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67 67  g;.  pNC->hasAgg
9c30: 20 3d 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 0;.  walkExpr
9c40: 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65  Tree(pExpr, name
9c50: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
9c60: 43 29 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e  C);.  if( pNC->n
9c70: 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  Err>0 ){.    Exp
9c80: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
9c90: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20  pr, EP_Error);. 
9ca0: 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61   }.  if( pNC->ha
9cb0: 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72  sAgg ){.    Expr
9cc0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
9cd0: 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65  r, EP_Agg);.  }e
9ce0: 6c 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73  lse if( savedHas
9cf0: 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  Agg ){.    pNC->
9d00: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  hasAgg = 1;.  }.
9d10: 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
9d20: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
9d30: 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a  EP_Error);.}../*
9d40: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69 6e  .** A pointer in
9d50: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
9d60: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64  tructure is used
9d70: 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61   to pass informa
9d80: 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  tion.** through 
9d90: 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e 74  walkExprTree int
9da0: 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79 53 74  o codeSubquerySt
9db0: 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ep()..*/.typedef
9dc0: 20 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64   struct QueryCod
9dd0: 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a 73  er QueryCoder;.s
9de0: 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65 72  truct QueryCoder
9df0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
9e00: 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se;       /* The
9e10: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
9e20: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
9e30: 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  t *pNC;    /* Na
9e40: 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72 73 74  mespace of first
9e50: 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72 79   enclosing query
9e60: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47   */.};.../*.** G
9e70: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
9e80: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
9e90: 65 73 20 75 73 65 64 20 61 73 20 61 6e 20 65 78  es used as an ex
9ea0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20  pression.** and 
9eb0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
9ec0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
9ed0: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
9ee0: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
9ef0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
9f00: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
9f10: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
9f20: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
9f30: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
9f40: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
9f50: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
9f60: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
9f70: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
9f80: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
9f90: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
9fa0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
9fb0: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
9fc0: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
9fd0: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
9fe0: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
9ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
a000: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
a010: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
a020: 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 23 69 66  subquery..*/.#if
a030: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a040: 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73  _SUBQUERY.void s
a050: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
a060: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
a070: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
a080: 0a 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20  .  int testAddr 
a090: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a0b0: 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72  e-time test addr
a0c0: 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ess */.  Vdbe *v
a0d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a0e0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
a0f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
a100: 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
a110: 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69  must be run in i
a120: 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72  ts entirety ever
a130: 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  y time it is enc
a140: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66  ountered.  ** if
a150: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
a160: 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20  owing is true:. 
a170: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54   **.  **    *  T
a180: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
a190: 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74  de is a correlat
a1a0: 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  ed subquery.  **
a1b0: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
a1c0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e  -hand side is an
a1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a1e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69   containing vari
a1f0: 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20  ables.  **    * 
a200: 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61   We are inside a
a210: 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20   trigger.  **.  
a220: 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
a230: 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65   above are false
a240: 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75  , then we can ru
a250: 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74  n this code just
a260: 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20   once.  ** save 
a270: 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64  the results, and
a280: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
a290: 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71  result on subseq
a2a0: 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73  uent invocations
a2b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78  ..  */.  if( !Ex
a2c0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
a2d0: 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65  (pExpr, EP_VarSe
a2e0: 6c 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65  lect) && !pParse
a2f0: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
a300: 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61     int mem = pPa
a310: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
a320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a330: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
a340: 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65   mem, 0);.    te
a350: 73 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  stAddr = sqlite3
a360: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a370: 49 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61  If, 0, 0);.    a
a380: 73 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e  ssert( testAddr>
a390: 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  0 || sqlite3Mall
a3a0: 6f 63 46 61 69 6c 65 64 28 29 20 29 3b 0a 20 20  ocFailed() );.  
a3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a3c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
a3d0: 20 31 2c 20 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20   1, mem);.  }.. 
a3e0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
a3f0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a400: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
a410: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
a420: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
a430: 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  fo;.      int ad
a440: 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64  dr;        /* Ad
a450: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
a460: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
a470: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
a480: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
a490: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
a4a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
a4b0: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
a4c0: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
a4d0: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
a4e0: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
a4f0: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
a500: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
a510: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
a520: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
a530: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
a540: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
a550: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
a560: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
a570: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
a580: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
a590: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
a5a0: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
a5b0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
a5c0: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
a5d0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
a5e0: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
a5f0: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
a600: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
a610: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
a620: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
a630: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
a640: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
a650: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
a660: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
a670: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
a680: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
a690: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
a6a0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
a6b0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a6c0: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
a6d0: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
a6e0: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
a6f0: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
a700: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
a710: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
a720: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
a730: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
a740: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
a750: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
a760: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
a770: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
a780: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
a790: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a7a0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a7b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a7c0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
a7d0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
a7e0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
a7f0: 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  &keyInfo, 0, siz
a800: 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20  eof(keyInfo));. 
a810: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69       keyInfo.nFi
a820: 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eld = 1;.      s
a830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a840: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
a850: 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  mns, pExpr->iTab
a860: 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69  le, 1);..      i
a870: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
a880: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
a890: 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72  Case 1:     expr
a8a0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
a8b0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
a8c0: 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
a8d0: 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
a8e0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
a8f0: 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
a900: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
a910: 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
a920: 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
a930: 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
a940: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
a950: 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54  Parm = pExpr->iT
a960: 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61  able +  (((int)a
a970: 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20  ffinity)<<16);. 
a980: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
a990: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  *pEList;.       
a9a0: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
a9b0: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
a9c0: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
a9d0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  le );.        sq
a9e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
a9f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
aa00: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61  ct, SRT_Set, iPa
aa10: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  rm, 0, 0, 0, 0);
aa20: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
aa30: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
aa40: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
aa50: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
aa60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
aa70: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65  ){ .          ke
aa80: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
aa90: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f   binaryCompareCo
aaa0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
aab0: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
aac0: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
aad0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
aae0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
aaf0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
ab00: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
ab10: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
ab20: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
ab30: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a  t).        **..*
ab40: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
ab50: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
ab60: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
ab70: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
ab80: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
ab90: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
aba0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
abb0: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
abc0: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
abd0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
abe0: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
abf0: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
ac00: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
ac10: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
ac20: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
ac30: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
ac40: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
ac50: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
ac60: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
ac70: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
ac80: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73  pList;.        s
ac90: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
aca0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20  tem *pItem;..   
acb0: 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
acc0: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
acd0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
ace0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
acf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65      }.        ke
ad00: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
ad10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70   pExpr->pLeft->p
ad20: 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f  Coll;..        /
ad30: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
ad40: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
ad50: 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
ad60: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70  .        for(i=p
ad70: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
ad80: 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30  em=pList->a; i>0
ad90: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
ada0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
adb0: 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45  *pE2 = pItem->pE
adc0: 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  xpr;..          
add0: 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  /* If the expres
ade0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73  sion is not cons
adf0: 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c  tant then we wil
ae00: 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  l need to.      
ae10: 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74      ** disable t
ae20: 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73  he test that was
ae30: 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65   generated above
ae40: 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
ae50: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
ae60: 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65  is code only exe
ae70: 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63  cutes once.  Bec
ae80: 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63  ause for a non-c
ae90: 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20  onstant.        
aea0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
aeb0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e  we need to rerun
aec0: 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20   this code each 
aed0: 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20  time..          
aee0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
aef0: 20 74 65 73 74 41 64 64 72 3e 30 20 26 26 20 21   testAddr>0 && !
af00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
af10: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
af20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
af30: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
af40: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 2c  p(v, testAddr-1,
af50: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   3);.           
af60: 20 74 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20   testAddr = 0;. 
af70: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
af80: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
af90: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
afa0: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
afb0: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
afc0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
afd0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
afe0: 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20  pParse, pE2);.  
aff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b000: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
b010: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26  eRecord, 1, 0, &
b020: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
b030: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b040: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b050: 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
b060: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
b070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b090: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
b0a0: 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e  , (void *)&keyIn
b0b0: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
b0c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b0d0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
b0e0: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
b0f0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
b100: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
b110: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
b120: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
b130: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
b140: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
b150: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
b160: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
b170: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
b180: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
b190: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
b1a0: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
b1b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
b1c0: 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  atic const Token
b1d0: 20 6f 6e 65 20 3d 20 7b 20 28 75 38 2a 29 22 31   one = { (u8*)"1
b1e0: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
b1f0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
b200: 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20       int iMem;. 
b210: 20 20 20 20 20 69 6e 74 20 73 6f 70 3b 0a 0a 20       int sop;.. 
b220: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
b230: 75 6d 6e 20 3d 20 69 4d 65 6d 20 3d 20 70 50 61  umn = iMem = pPa
b240: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
b250: 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
b260: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
b270: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b280: 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20  K_SELECT ){.    
b290: 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 4d 65      sop = SRT_Me
b2a0: 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
b2b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b2c0: 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 69 4d 65 6d 2c  P_MemNull, iMem,
b2d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
b2e0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
b2f0: 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
b300: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
b310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 6f  else{.        so
b320: 70 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a  p = SRT_Exists;.
b330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b350: 65 6d 49 6e 74 2c 20 30 2c 20 69 4d 65 6d 29 3b  emInt, 0, iMem);
b360: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
b370: 6d 65 6e 74 28 28 76 2c 20 22 23 20 49 6e 69 74  ment((v, "# Init
b380: 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29   EXISTS result")
b390: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b3a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
b3b0: 74 65 28 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29  te(pSel->pLimit)
b3c0: 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c  ;.      pSel->pL
b3d0: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
b3e0: 70 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  pr(TK_INTEGER, 0
b3f0: 2c 20 30 2c 20 26 6f 6e 65 29 3b 0a 20 20 20 20  , 0, &one);.    
b400: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
b410: 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f  pParse, pSel, so
b420: 70 2c 20 69 4d 65 6d 2c 20 30 2c 20 30 2c 20 30  p, iMem, 0, 0, 0
b430: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
b440: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
b450: 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a  if( testAddr ){.
b460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b470: 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41  umpHere(v, testA
b480: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ddr);.  }.  retu
b490: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
b4a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b4b0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  UERY */../*.** G
b4c0: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
b4d0: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
b4e0: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
b4f0: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
b500: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f  text z[0..n-1] o
b510: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  n the stack..*/.
b520: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
b530: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
b540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
b550: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
b560: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65  .  if( sqlite3Ge
b570: 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b  tInt32(z, &i) ){
b580: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b590: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b5a0: 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65  ger, i, 0);.  }e
b5b0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
b5c0: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29  itsIn64Bits(z) )
b5d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b5e0: 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34  eOp3(v, OP_Int64
b5f0: 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20  , 0, 0, z, n);. 
b600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
b610: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
b620: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
b630: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
b640: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
b650: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
b660: 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
b670: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
b680: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
b690: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e  ve the result on
b6a0: 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63   the top of stac
b6b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  k..**.** This co
b6c0: 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
b6d0: 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
b6e0: 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
b6f0: 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
b700: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
b710: 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
b720: 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
b730: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
b740: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
b750: 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
b760: 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
b770: 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
b780: 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
b790: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
b7a0: 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
b7b0: 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
b7c0: 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
b7d0: 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
b7e0: 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
b7f0: 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
b800: 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
b810: 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
b820: 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
b830: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
b840: 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65   *pExpr){.  Vdbe
b850: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
b860: 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20  dbe;.  int op;. 
b870: 20 69 6e 74 20 73 74 61 63 6b 43 68 6e 67 20 3d   int stackChng =
b880: 20 31 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74   1;    /* Amount
b890: 20 6f 66 20 63 68 61 6e 67 65 20 74 6f 20 73 74   of change to st
b8a0: 61 63 6b 20 64 65 70 74 68 20 2a 2f 0a 0a 20 20  ack depth */..  
b8b0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
b8c0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  n;.  if( pExpr==
b8d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b8e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b8f0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
b900: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
b910: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
b920: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
b930: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
b940: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
b950: 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
b960: 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
b970: 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
b980: 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
b990: 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
b9a0: 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
b9b0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
b9c0: 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
b9d0: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  de ){.        sq
b9e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b9f0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 43  , OP_MemLoad, pC
ba00: 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  ol->iMem, 0);.  
ba10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
ba30: 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
ba40: 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
ba50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ba60: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
ba70: 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
ba80: 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
bab0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
bac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
bad0: 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
bae0: 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
baf0: 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
bb00: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
bb10: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
bb20: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
bb30: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
bb40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
bb50: 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
bb60: 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
bb70: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
bb80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bb90: 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74  pParse->ckOffset
bba0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  >0 );.        sq
bbb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bbc0: 2c 20 4f 50 5f 44 75 70 2c 20 70 50 61 72 73 65  , OP_Dup, pParse
bbd0: 2d 3e 63 6b 4f 66 66 73 65 74 2d 70 45 78 70 72  ->ckOffset-pExpr
bbe0: 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 2c 20 31 29 3b  ->iColumn-1, 1);
bbf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
bc00: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
bc10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 61  =0 ){.        Ta
bc20: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70  ble *pTab = pExp
bc30: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
bc40: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
bc50: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
bc60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc70: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
bc80: 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
bc90: 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , iCol);.       
bca0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
bcb0: 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
bcc0: 43 6f 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Col);.#ifndef SQ
bcd0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
bce0: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 20  NG_POINT.       
bcf0: 20 69 66 28 20 70 54 61 62 20 26 26 20 70 54 61   if( pTab && pTa
bd00: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  b->aCol[iCol].af
bd10: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
bd20: 46 46 5f 52 45 41 4c 20 29 7b 0a 20 20 20 20 20  FF_REAL ){.     
bd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 61 6c  AddOp(v, OP_Real
bd50: 41 66 66 69 6e 69 74 79 2c 20 30 2c 20 30 29 3b  Affinity, 0, 0);
bd60: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
bd70: 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
bd80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bd90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
bda0: 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  wid, pExpr->iTab
bdb0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  le, 0);.      }.
bdc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bdd0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
bde0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
bdf0: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 28  codeInteger(v, (
be00: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
be10: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
be20: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
be30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
be40: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
be50: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
be60: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
be70: 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65   TK_FLOAT==OP_Re
be80: 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  al );.      asse
be90: 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f  rt( TK_STRING==O
bea0: 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20  P_String8 );.   
beb0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
bec0: 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20  eExpr(pExpr);.  
bed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
bee0: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
bef0: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
bf00: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
bf10: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
bf20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bf30: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
bf40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bf50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
bf60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
bf70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
bf80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bf90: 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
bfa0: 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
bfb0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
bfc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
bfd0: 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
bfe0: 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78   TK_BLOB==OP_Hex
bff0: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e 20  Blob );.      n 
c000: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  = pExpr->token.n
c010: 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d 20   - 3;.      z = 
c020: 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
c030: 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20 20 20 20  ken.z + 2;.     
c040: 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
c050: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
c060: 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 22  ){.        z = "
c070: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
c080: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c090: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 2c 20  v, op, 0, 0, z, 
c0a0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
c0b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c0c0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
c0d0: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
c0e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c0f0: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
c100: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
c110: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
c120: 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20  >token.n>1 ){.  
c130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c140: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
c150: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
c160: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
c170: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d  oken.n);.      }
c180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c190: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c1a0: 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
c1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c1c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
c1d0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
c1e0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
c1f0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c200: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
c210: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
c220: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
c230: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
c240: 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
c250: 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
c260: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 2c 20  .      int aff, 
c270: 74 6f 5f 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  to_op;.      sql
c280: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c290: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
c2a0: 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20  t);.      aff = 
c2b0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
c2c0: 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65  ype(&pExpr->toke
c2d0: 6e 29 3b 0a 20 20 20 20 20 20 74 6f 5f 6f 70 20  n);.      to_op 
c2e0: 3d 20 61 66 66 20 2d 20 53 51 4c 49 54 45 5f 41  = aff - SQLITE_A
c2f0: 46 46 5f 54 45 58 54 20 2b 20 4f 50 5f 54 6f 54  FF_TEXT + OP_ToT
c300: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
c310: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 54  t( to_op==OP_ToT
c320: 65 78 74 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  ext    || aff!=S
c330: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
c340: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
c350: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 42  t( to_op==OP_ToB
c360: 6c 6f 62 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  lob    || aff!=S
c370: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20  QLITE_AFF_NONE  
c380: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
c390: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 4e  t( to_op==OP_ToN
c3a0: 75 6d 65 72 69 63 20 7c 7c 20 61 66 66 21 3d 53  umeric || aff!=S
c3b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
c3c0: 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  C );.      asser
c3d0: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 49  t( to_op==OP_ToI
c3e0: 6e 74 20 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  nt     || aff!=S
c3f0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c400: 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
c410: 74 28 20 74 6f 5f 6f 70 3d 3d 4f 50 5f 54 6f 52  t( to_op==OP_ToR
c420: 65 61 6c 20 20 20 20 7c 7c 20 61 66 66 21 3d 53  eal    || aff!=S
c430: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
c440: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
c450: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74  e3VdbeAddOp(v, t
c460: 6f 5f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  o_op, 0, 0);.   
c470: 20 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30     stackChng = 0
c480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c490: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
c4a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
c4b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
c4c0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
c4d0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
c4e0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
c4f0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
c500: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
c510: 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
c520: 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
c530: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c540: 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
c550: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c560: 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
c570: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c580: 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
c590: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
c5a0: 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
c5b0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
c5c0: 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73  OP_Ne );.      s
c5d0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c5e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
c5f0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
c600: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c610: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
c620: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
c630: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
c640: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
c650: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30  r->pRight, op, 0
c660: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63  , 0);.      stac
c670: 6b 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20  kChng = -1;.    
c680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c690: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
c6a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
c6b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
c6c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
c6d0: 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
c6e0: 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
c6f0: 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
c700: 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
c710: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
c720: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
c730: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
c740: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
c750: 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
c760: 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
c770: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c780: 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
c790: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c7a0: 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20  K_OR==OP_Or );. 
c7b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c7c0: 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a  PLUS==OP_Add );.
c7d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c7e0: 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
c7f0: 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  act );.      ass
c800: 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
c810: 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20  Remainder );.   
c820: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
c830: 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
c840: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c850: 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
c860: 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  tOr );.      ass
c870: 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
c880: 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20  P_Divide );.    
c890: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
c8a0: 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
c8b0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
c8c0: 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
c8d0: 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20  _ShiftRight );. 
c8e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c8f0: 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
c900: 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
c910: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c920: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
c930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c940: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c950: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
c960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c970: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
c980: 20 30 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b   0);.      stack
c990: 43 68 6e 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20  Chng = -1;.     
c9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c9b0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
c9c0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
c9d0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
c9e0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
c9f0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
ca00: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
ca10: 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c  ==TK_FLOAT || pL
ca20: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
ca30: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54  GER ){.        T
ca40: 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74  oken *p = &pLeft
ca50: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
ca60: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
ca70: 65 33 4d 50 72 69 6e 74 66 28 22 2d 25 2e 2a 73  e3MPrintf("-%.*s
ca80: 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a  ", p->n, p->z);.
ca90: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66          if( pLef
caa0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
cab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
cac0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
cad0: 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c  P_Real, 0, 0, z,
cae0: 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20   p->n+1);.      
caf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cb00: 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
cb10: 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20  , z, p->n+1);.  
cb20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cb30: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
cb40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cb50: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
cb60: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
cb70: 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d   TK_NOT */.    }
cb80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
cb90: 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
cba0: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
cbb0: 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
cbc0: 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
cbd0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
cbe0: 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
cbf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cc00: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
cc10: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
cc20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cc30: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
cc40: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
cc50: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
cc60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
cc70: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
cc80: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
cc90: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
cca0: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
ccb0: 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
ccc0: 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
ccd0: 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
cce0: 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
ccf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cd00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
cd10: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
cd20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cd30: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
cd40: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
cd50: 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56   dest = sqlite3V
cd60: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
cd70: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
cd80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cd90: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
cda0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cdb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
cdc0: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  mm, -1, 0);.    
cdd0: 20 20 73 74 61 63 6b 43 68 6e 67 20 3d 20 30 3b    stackChng = 0;
cde0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cdf0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ce00: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
ce10: 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
ce20: 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
ce30: 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
ce40: 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
ce50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ce60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
ce70: 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
ce80: 74 65 3a 20 25 54 22 2c 0a 20 20 20 20 20 20 20  te: %T",.       
ce90: 20 20 20 20 20 26 70 45 78 70 72 2d 3e 73 70 61       &pExpr->spa
cea0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
ceb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cec0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ced0: 4d 65 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f 2d 3e  MemLoad, pInfo->
cee0: 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67  aFunc[pExpr->iAg
cef0: 67 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  g].iMem, 0);.   
cf00: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
cf10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
cf20: 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
cf30: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
cf40: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
cf50: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
cf60: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
cf70: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
cf80: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
cf90: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
cfa0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
cfb0: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20       int nId;.  
cfc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cfd0: 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  zId;.      int c
cfe0: 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  onstMask = 0;.  
cff0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
d000: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
d010: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
d020: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
d030: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  = 0;.      zId =
d040: 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74   (char*)pExpr->t
d050: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49  oken.z;.      nI
d060: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
d070: 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  .n;.      pDef =
d080: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
d090: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
d0a0: 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72   zId, nId, nExpr
d0b0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
d0c0: 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30   assert( pDef!=0
d0d0: 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20   );.      nExpr 
d0e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
d0f0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
d100: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
d110: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
d120: 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a   && i<32; i++){.
d130: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
d140: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
d150: 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  t(pList->a[i].pE
d160: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
d170: 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 28    constMask |= (
d180: 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  1<<i);.        }
d190: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
d1a0: 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26  f->needCollSeq &
d1b0: 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
d1c0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
d1d0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
d1e0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
d1f0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
d200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d210: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
d220: 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20  eedCollSeq ){.  
d230: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
d240: 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
d250: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
d260: 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
d270: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
d280: 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
d290: 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
d2a0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
d2b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d2c0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75  VdbeOp3(v, OP_Fu
d2d0: 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73  nction, constMas
d2e0: 6b 2c 20 6e 45 78 70 72 2c 20 28 63 68 61 72 2a  k, nExpr, (char*
d2f0: 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45  )pDef, P3_FUNCDE
d300: 46 29 3b 0a 20 20 20 20 20 20 73 74 61 63 6b 43  F);.      stackC
d310: 68 6e 67 20 3d 20 31 2d 6e 45 78 70 72 3b 0a 20  hng = 1-nExpr;. 
d320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d330: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
d340: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
d350: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
d360: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
d370: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  ELECT: {.      i
d380: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
d390: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
d3a0: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
d3b0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
d3c0: 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
d3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d3e0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
d3f0: 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  d, pExpr->iColum
d400: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62  n, 0);.      Vdb
d410: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
d420: 6c 6f 61 64 20 73 75 62 71 75 65 72 79 20 72 65  load subquery re
d430: 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 62  sult"));.      b
d440: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d450: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
d460: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
d470: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
d480: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6b 4f  y;.      int ckO
d490: 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e  ffset = pParse->
d4a0: 63 6b 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  ckOffset;.      
d4b0: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
d4c0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
d4d0: 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  pr);..      /* F
d4e0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66  igure out the af
d4f0: 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f  finity to use to
d500: 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72   create a key fr
d510: 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  om the results. 
d520: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65       ** of the e
d530: 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e  xpression. affin
d540: 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20  ityStr stores a 
d550: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75  static string su
d560: 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20  itable for.     
d570: 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b   ** P3 of OP_Mak
d580: 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a  eRecord..      *
d590: 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  /.      affinity
d5a0: 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
d5b0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20  inity(pExpr);.. 
d5c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d5d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
d5e0: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ger, 1, 0);.    
d5f0: 20 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73    pParse->ckOffs
d600: 65 74 20 3d 20 63 6b 4f 66 66 73 65 74 2b 31 3b  et = ckOffset+1;
d610: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d620: 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20  the <expr> from 
d630: 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29  "<expr> IN (...)
d640: 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  ". The temporary
d650: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
d660: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f  pExpr->iTable co
d670: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
d680: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
d690: 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20  he (...) set..  
d6a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
d6b0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d6c0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
d6d0: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
d6e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d6f0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d710: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
d720: 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20  , -1, addr+4);  
d730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64            /* add
d740: 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73  r + 0 */.      s
d750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d760: 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29  v, OP_Pop, 2, 0)
d770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d790: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
d7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d7b0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
d7c0: 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20  , addr+7);.     
d7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
d7e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
d7f0: 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
d800: 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72  y, 1);   /* addr
d810: 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71   + 4 */.      sq
d820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d830: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
d840: 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b  r->iTable, addr+
d850: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
d860: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d870: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f    /* addr + 6 */
d8a0: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
d8b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d8c0: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
d8d0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
d8e0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
d8f0: 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
d900: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
d910: 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
d920: 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  >pList->a;.     
d930: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
d940: 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
d950: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d960: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
d970: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
d980: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d990: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
d9a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d9b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
d9c0: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
d9d0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
d9e0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
d9f0: 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  _Ge, 0, 0);.    
da00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da10: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
da20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74  , 0);.      pLIt
da30: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67  em++;.      pRig
da40: 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
da50: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
da60: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
da70: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
da80: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
da90: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
daa0: 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29  ht, OP_Le, 0, 0)
dab0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
dad0: 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  nd, 0, 0);.     
dae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
daf0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
db00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
db10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
db20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
db30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
db40: 20 20 20 20 20 20 73 74 61 63 6b 43 68 6e 67 20        stackChng 
db50: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
db60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
db70: 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
db80: 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c    int expr_end_l
db90: 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  abel;.      int 
dba0: 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20  jumpInst;.      
dbb0: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
dbc0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78   int i;.      Ex
dbd0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
dbe0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
dbf0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
dc00: 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73  telem;..      as
dc10: 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
dc20: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
dc30: 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ((pExpr->pList->
dc40: 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29  nExpr % 2) == 0)
dc50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
dc60: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
dc70: 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
dc80: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
dc90: 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
dca0: 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
dcb0: 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
dcc0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
dcd0: 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c        expr_end_l
dce0: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
dcf0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
dd00: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
dd10: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
dd20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
dd30: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
dd40: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
dd50: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
dd60: 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
dd70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dd80: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
dd90: 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
dda0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
ddb0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
ddc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
ddd0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dde0: 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20  OP_Dup, 1, 1);. 
ddf0: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
de00: 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  t = codeCompare(
de10: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
de20: 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  Left, aListelem[
de30: 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20  i].pExpr,.      
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
de60: 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 0, 1);.       
de70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de80: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
de90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
dea0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
deb0: 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65  umpInst = sqlite
dec0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ded0: 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  _IfNot, 1, 0);. 
dee0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
def0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
df00: 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
df10: 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a  em[i+1].pExpr);.
df20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
df30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
df40: 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64  oto, 0, expr_end
df50: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  _label);.       
df60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
df70: 48 65 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74  Here(v, jumpInst
df80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
df90: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
dfa0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
dfb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
dfc0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
dfd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
dfe0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
dff0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e000: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e010: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
e020: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e030: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e040: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
e050: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
e060: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e070: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e080: 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61  l(v, expr_end_la
e090: 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
e0a0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
e0b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
e0c0: 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
e0d0: 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
e0e0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
e0f0: 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
e100: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e110: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
e140: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
e150: 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
e160: 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a  ram");..return;.
e170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e180: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
e190: 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  !=OE_Ignore ){. 
e1a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e1b0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
e1c0: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20  OE_Rollback ||. 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
e1f0: 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20  = OE_Abort ||.  
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e210: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
e220: 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20   OE_Fail );.    
e230: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
e240: 6f 74 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a  oteExpr(pExpr);.
e250: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e260: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61  VdbeOp3(v, OP_Ha
e270: 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  lt, SQLITE_CONST
e280: 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43  RAINT, pExpr->iC
e290: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e2b0: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
e2c0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
e2d0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 20 65  en.n);.      } e
e2e0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 61  lse {.         a
e2f0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
e300: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f  olumn == OE_Igno
e310: 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  re );.         s
e320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e330: 76 2c 20 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70  v, OP_ContextPop
e340: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
e350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e360: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
e370: 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
e380: 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29  ack->ignoreJump)
e390: 3b 0a 20 20 20 20 20 20 20 20 20 56 64 62 65 43  ;.         VdbeC
e3a0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 61  omment((v, "# ra
e3b0: 69 73 65 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a  ise(IGNORE)"));.
e3c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
e3d0: 61 63 6b 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ackChng = 0;.   
e3e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e3f0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
e400: 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66 66 73  ( pParse->ckOffs
e410: 65 74 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  et ){.    pParse
e420: 2d 3e 63 6b 4f 66 66 73 65 74 20 2b 3d 20 73 74  ->ckOffset += st
e430: 61 63 6b 43 68 6e 67 3b 0a 20 20 20 20 61 73 73  ackChng;.    ass
e440: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 63 6b 4f  ert( pParse->ckO
e450: 66 66 73 65 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  ffset );.  }.}..
e460: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e470: 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a  MIT_TRIGGER./*.*
e480: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e490: 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68  that evalutes th
e4a0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
e4b0: 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68  on and leaves th
e4c0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
e4d0: 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 61  he stack.  See a
e4e0: 6c 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  lso sqlite3ExprC
e4f0: 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ode()..**.** Thi
e500: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
e510: 61 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20 72  also cache the r
e520: 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79  esult and modify
e530: 20 74 68 65 20 70 45 78 70 72 20 74 72 65 65 0a   the pExpr tree.
e540: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ** so that it wi
e550: 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74  ll make use of t
e560: 68 65 20 63 61 63 68 65 64 20 72 65 73 75 6c 74  he cached result
e570: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 65   on subsequent e
e580: 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61  valuations.** ra
e590: 74 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75 61  ther than evalua
e5a0: 74 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70  te the whole exp
e5b0: 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20  ression again.  
e5c0: 54 72 69 76 69 61 6c 20 65 78 70 72 65 73 73 69  Trivial expressi
e5d0: 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63  ons are.** not c
e5e0: 61 63 68 65 64 2e 20 20 49 66 20 74 68 65 20 65  ached.  If the e
e5f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61 63  xpression is cac
e600: 68 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74 20  hed, its result 
e610: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 0a  is stored in a .
e620: 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ** memory locati
e630: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
e640: 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
e650: 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
e660: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
e670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
e680: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
e690: 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64  t iMem;.  int ad
e6a0: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66  dr1, addr2;.  if
e6b0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
e6c0: 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
e6d0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e6e0: 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  r(v);.  sqlite3E
e6f0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e700: 70 45 78 70 72 29 3b 0a 20 20 61 64 64 72 32 20  pExpr);.  addr2 
e710: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
e720: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
e730: 66 28 20 61 64 64 72 32 3e 61 64 64 72 31 2b 31  f( addr2>addr1+1
e740: 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 47   || sqlite3VdbeG
e750: 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29 2d 3e  etOp(v, addr1)->
e760: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
e770: 69 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20  ion ){.    iMem 
e780: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
e790: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
e7a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e7b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
e7c0: 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
e7d0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
e7e0: 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
e7f0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
e800: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
e810: 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
e820: 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
e830: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
e840: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
e850: 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20  n list onto the 
e860: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  stack..**.** Ret
e870: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
e880: 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65  f elements pushe
e890: 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  d onto the stack
e8a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e8b0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
e8c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e8d0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
e8e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
e8f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20  xprList *pList  
e900: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e910: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
e920: 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  oded */.){.  str
e930: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e940: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
e950: 69 2c 20 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73  i, n;.  if( pLis
e960: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
e970: 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
e980: 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  xpr;.  for(pItem
e990: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20  =pList->a, i=n; 
e9a0: 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
e9b0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
e9c0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e9d0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
e9e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
e9f0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ea00: 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
ea10: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
ea20: 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
ea30: 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
ea40: 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
ea50: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ea60: 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
ea70: 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
ea80: 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
ea90: 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
eaa0: 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
eab0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
eac0: 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
ead0: 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
eae0: 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
eaf0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
eb00: 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
eb10: 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
eb20: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  s true..**.** Th
eb30: 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
eb40: 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
eb50: 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
eb60: 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
eb70: 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
eb80: 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
eb90: 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
eba0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
ebb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
ebc0: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
ebd0: 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
ebe0: 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
ebf0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
ec00: 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
ec10: 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
ec20: 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
ec30: 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
ec40: 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
ec50: 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
ec60: 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
ec70: 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
ec80: 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
ec90: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
eca0: 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
ecb0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
ecc0: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
ecd0: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
ece0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
ecf0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
ed00: 20 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73   0;.  int ckOffs
ed10: 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f  et = pParse->ckO
ed20: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d  ffset;.  if( v==
ed30: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
ed40: 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20 70  return;.  op = p
ed50: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
ed60: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
ed70: 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
ed80: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
ed90: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
eda0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
edb0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
edc0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
edd0: 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e  ft, d2, !jumpIfN
ede0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
edf0: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
ee00: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
ee10: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
ee20: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
ee30: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
ee40: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
ee50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ee60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
ee70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
ee80: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
ee90: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
eea0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
eeb0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
eec0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
eed0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
eee0: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
eef0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
ef00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ef10: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
ef20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
ef30: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
ef40: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
ef50: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ef60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ef70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
ef80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
ef90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
efa0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
efb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
efc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
efd0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
efe0: 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
eff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
f000: 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
f010: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
f020: 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
f030: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
f040: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
f050: 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
f060: 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
f070: 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
f080: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
f090: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f0a0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f0b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
f0c0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f0d0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
f0e0: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
f0f0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
f100: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
f110: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73  >pRight, op, des
f120: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
f130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f140: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
f150: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
f160: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
f170: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
f180: 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
f190: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f1a0: 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
f1b0: 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
f1c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f1d0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
f1e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
f1f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f200: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
f210: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f220: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
f230: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
f240: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
f250: 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79 20  on "x BETWEEN y 
f260: 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d  AND z" is implem
f270: 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20  ented as:.      
f280: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46  **.      ** 1 IF
f290: 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a   (x < y) GOTO 3.
f2a0: 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28 78        ** 2 IF (x
f2b0: 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73   <= z) GOTO <des
f2c0: 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e  t>.      ** 3 ..
f2d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f2e0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
f2f0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
f300: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
f310: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
f320: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
f330: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
f340: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f350: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
f360: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f370: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
f380: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
f390: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f3a0: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
f3b0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 63  ;.      addr = c
f3c0: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
f3d0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
f3e0: 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d  , OP_Lt, 0, !jum
f3f0: 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
f400: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
f410: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
f420: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
f430: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f440: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
f450: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
f460: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
f470: 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c  ht, OP_Le, dest,
f480: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20   jumpIfNull);.. 
f490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f4a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
f4b0: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
f4c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f4d0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
f4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f4f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
f500: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 1, 0);.      b
f510: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f520: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
f530: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f540: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
f550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f560: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
f570: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
f580: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
f590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
f5a0: 61 72 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d  arse->ckOffset =
f5b0: 20 63 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a   ckOffset;.}../*
f5c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f5d0: 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
f5e0: 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
f5f0: 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
f600: 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
f610: 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
f620: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
f630: 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74  false but execut
f640: 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
f650: 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
f660: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
f670: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
f680: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
f690: 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
f6a0: 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
f6b0: 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65  e nor false) the
f6c0: 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d  n.** jump if jum
f6d0: 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20  pIfNull is true 
f6e0: 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
f6f0: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
f700: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   false..*/.void 
f710: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
f720: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
f730: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
f740: 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d  nt dest, int jum
f750: 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65  pIfNull){.  Vdbe
f760: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f770: 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20  dbe;.  int op = 
f780: 30 3b 0a 20 20 69 6e 74 20 63 6b 4f 66 66 73 65  0;.  int ckOffse
f790: 74 20 3d 20 70 50 61 72 73 65 2d 3e 63 6b 4f 66  t = pParse->ckOf
f7a0: 66 73 65 74 3b 0a 20 20 69 66 28 20 76 3d 3d 30  fset;.  if( v==0
f7b0: 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72   || pExpr==0 ) r
f7c0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
f7d0: 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
f7e0: 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
f7f0: 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
f800: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
f810: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
f820: 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
f830: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
f840: 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
f850: 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
f860: 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
f870: 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
f880: 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
f890: 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
f8a0: 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
f8b0: 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
f8c0: 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
f8d0: 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
f8e0: 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
f8f0: 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
f900: 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
f910: 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
f920: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
f930: 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
f940: 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
f950: 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
f960: 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
f970: 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
f980: 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
f990: 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
f9a0: 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
f9b0: 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
f9c0: 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
f9d0: 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
f9e0: 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
f9f0: 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
fa00: 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
fa10: 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
fa20: 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
fa30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
fa40: 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
fa50: 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
fa60: 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
fa70: 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
fa80: 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
fa90: 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
faa0: 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
fab0: 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
fac0: 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
fad0: 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
fae0: 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
faf0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
fb00: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
fb10: 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
fb20: 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
fb30: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
fb40: 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
fb50: 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
fb60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
fb70: 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
fb80: 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
fb90: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
fba0: 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
fbb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
fbc0: 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
fbd0: 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
fbe0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
fbf0: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
fc00: 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
fc10: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
fc20: 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
fc30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
fc40: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
fc50: 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
fc60: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
fc70: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
fc80: 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73  K_AND: {.      s
fc90: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
fca0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
fcb0: 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
fcc0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
fcd0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
fce0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
fcf0: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
fd00: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
fd10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fd20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
fd30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
fd40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
fd50: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
fd60: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
fd70: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
fd80: 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
fd90: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
fda0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
fdb0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
fdc0: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
fdd0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
fde0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
fdf0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
fe00: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
fe10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
fe20: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
fe30: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
fe40: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
fe50: 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
fe60: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
fe70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fe80: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
fe90: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
fea0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
feb0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
fec0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
fed0: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
fee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
fef0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ff00: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
ff10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ff20: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
ff30: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
ff40: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
ff50: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
ff60: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
ff70: 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
ff80: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
ff90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ffa0: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
ffb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
ffc0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
ffd0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ffe0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
fff0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10000 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
10010 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
10020 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10030 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
10040 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  EN: {.      /* T
10050 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10060 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e   "x BETWEEN y AN
10070 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70 6c  D z". It is impl
10080 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20  emented as:.    
10090 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20    **.      ** 1 
100a0 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f  IF (x >= y) GOTO
100b0 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47 4f   3.      ** 2 GO
100c0 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
100d0 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29 20  ** 3 IF (x > z) 
100e0 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
100f0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
10100 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ddr;.      Expr 
10110 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
10120 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
10130 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
10140 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
10150 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
10160 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10170 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
10180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10190 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
101a0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
101b0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
101c0 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
101d0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
101e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
101f0 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  v);.      codeCo
10200 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
10210 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
10220 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d  Ge, addr+3, !jum
10230 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
10240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10250 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
10260 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10270 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10280 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
10290 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
102a0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
102b0 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
102c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
102d0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
102e0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
102f0 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
10300 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c  , pRight, OP_Gt,
10310 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
10320 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
10330 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
10340 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
10350 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
10360 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
10370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10380 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  Op(v, OP_IfNot, 
10390 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
103a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
103b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72      }.  }.  pPar
103c0 73 65 2d 3e 63 6b 4f 66 66 73 65 74 20 3d 20 63  se->ckOffset = c
103d0 6b 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  kOffset;.}../*.*
103e0 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
103f0 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
10400 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
10410 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
10420 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68  n-zero).** if th
10430 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
10440 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53   and return FALS
10450 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  E if they differ
10460 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a   in any way..*/.
10470 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
10480 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
10490 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e   Expr *pB){.  in
104a0 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
104b0 7c 7c 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ||pB==0 ){.    r
104c0 65 74 75 72 6e 20 70 42 3d 3d 70 41 3b 0a 20 20  eturn pB==pA;.  
104d0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
104e0 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
104f0 30 3b 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  0;.  if( (pA->fl
10500 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
10510 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
10520 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
10530 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10540 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
10550 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
10560 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
10570 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
10580 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
10590 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
105a0 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
105b0 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c   0;.  if( pA->pL
105c0 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
105d0 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  B->pList==0 ) re
105e0 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
105f0 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
10600 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  !=pB->pList->nEx
10610 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  pr ) return 0;. 
10620 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
10630 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
10640 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
10650 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
10660 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61  are(pA->pList->a
10670 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70  [i].pExpr, pB->p
10680 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10690 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
106a0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
106b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
106c0 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pB->pList ){.  
106d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
106e0 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63    if( pA->pSelec
106f0 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74  t || pB->pSelect
10700 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10710 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
10720 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d  B->iTable || pA-
10730 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
10740 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30  olumn ) return 0
10750 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65  ;.  if( pA->toke
10760 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n.z ){.    if( p
10770 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20  B->token.z==0 ) 
10780 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
10790 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70  ( pB->token.n!=p
107a0 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74  A->token.n ) ret
107b0 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73  urn 0;.    if( s
107c0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
107d0 63 68 61 72 2a 29 70 41 2d 3e 74 6f 6b 65 6e 2e  char*)pA->token.
107e0 7a 2c 28 63 68 61 72 2a 29 70 42 2d 3e 74 6f 6b  z,(char*)pB->tok
107f0 65 6e 2e 7a 2c 70 42 2d 3e 74 6f 6b 65 6e 2e 6e  en.z,pB->token.n
10800 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
10810 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10820 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
10830 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
10840 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
10850 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
10860 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  ] array.  Return
10870 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a 2a   the index of.**
10880 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e 74   the new element
10890 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61  .  Return a nega
108a0 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6d  tive number if m
108b0 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a  alloc fails..*/.
108c0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41 67  static int addAg
108d0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 41 67 67 49  gInfoColumn(AggI
108e0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
108f0 6e 74 20 69 3b 0a 20 20 69 20 3d 20 73 71 6c 69  nt i;.  i = sqli
10900 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
10910 28 28 76 6f 69 64 2a 2a 29 26 70 49 6e 66 6f 2d  ((void**)&pInfo-
10920 3e 61 43 6f 6c 2c 20 73 69 7a 65 6f 66 28 70 49  >aCol, sizeof(pI
10930 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 20 33  nfo->aCol[0]), 3
10940 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
10950 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
10960 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
10970 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
10980 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
10990 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
109a0 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
109b0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
109c0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
109d0 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
109e0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
109f0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
10a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10a10 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 41  addAggInfoFunc(A
10a20 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
10a30 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 73    int i;.  i = s
10a40 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
10a50 61 74 65 28 28 76 6f 69 64 2a 2a 29 26 70 49 6e  ate((void**)&pIn
10a60 66 6f 2d 3e 61 46 75 6e 63 2c 20 73 69 7a 65 6f  fo->aFunc, sizeo
10a70 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
10a80 5d 29 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 3c  ]), 2);.  if( i<
10a90 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10aa0 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
10ab0 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a   i;.}    ../*.**
10ac0 20 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e   This is an xFun
10ad0 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
10ae0 65 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70  ee() used to imp
10af0 6c 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74  lement .** sqlit
10b00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
10b10 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
10b20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
10b30 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
10b40 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
10b50 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
10b60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
10b70 6e 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72  nalyzes the aggr
10b80 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61  egate function a
10b90 74 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  t pExpr..*/.stat
10ba0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
10bb0 67 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41  gregate(void *pA
10bc0 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
10bd0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
10be0 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
10bf0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70  (NameContext *)p
10c00 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
10c10 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
10c20 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
10c30 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
10c40 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e  SrcList;.  AggIn
10c50 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
10c60 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  NC->pAggInfo;.  
10c70 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
10c80 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
10c90 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
10ca0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
10cb0 20 73 65 65 20 69 66 20 74 68 65 20 63 6f 6c 75   see if the colu
10cc0 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20  mn is in one of 
10cd0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
10ce0 65 20 46 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20  e FROM.      ** 
10cf0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 61 67  clause of the ag
10d00 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
10d10 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c  .      if( pSrcL
10d20 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
10d30 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
10d40 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
10d50 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
10d60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
10d70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
10d80 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
10d90 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
10da0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
10db0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
10dc0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
10dd0 6d 2d 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  m->iCursor ){.  
10de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10df0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
10e00 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
10e10 61 74 20 70 45 78 70 72 20 72 65 66 65 72 73 20  at pExpr refers 
10e20 74 6f 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20  to a table.     
10e30 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69         ** that i
10e40 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
10e50 61 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72  ause of the aggr
10e60 65 67 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20  egate query.  . 
10e70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20             **.  
10e80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b            ** Mak
10e90 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  e an entry for t
10ea0 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67  he column in pAg
10eb0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66  gInfo->aCol[] if
10ec0 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 20   there.         
10ed0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20     ** is not an 
10ee0 65 6e 74 72 79 20 74 68 65 72 65 20 61 6c 72 65  entry there alre
10ef0 61 64 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ady..           
10f00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
10f10 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
10f20 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
10f30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
10f40 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
10f50 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
10f70 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
10f80 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
10fb0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
10fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
10fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11000 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49      if( i>=pAggI
11010 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  nfo->nColumn && 
11020 28 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (i = addAggInfoC
11030 6f 6c 75 6d 6e 28 70 41 67 67 49 6e 66 6f 29 29  olumn(pAggInfo))
11040 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
11050 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
11060 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a  gInfo->aCol[i];.
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
11080 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
11090 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
110a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
110b0 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
110c0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
110d0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
110e0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
110f0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
11100 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
11110 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
11120 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
11130 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
11150 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
11160 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
11170 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
11180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11190 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
111a0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
111b0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
111c0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
111d0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
111e0 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
111f0 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
11200 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
11210 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
11220 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
11230 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
11240 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
11250 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
11260 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
11270 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
11280 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
11290 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
112a0 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
112d0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
112e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112f0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
11300 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11330 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
11370 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
11380 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
11390 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
113a0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
113b0 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
113c0 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
113d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
113e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
113f0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
11400 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
11410 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
11420 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
11430 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
11440 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
11450 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
11460 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
11470 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
11480 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
11490 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
114a0 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
114b0 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
114c0 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
114d0 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
114e0 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
114f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
11500 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
11510 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
11520 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
11530 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
11540 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
11550 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
11560 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
11570 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11580 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
11590 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
115a0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
115b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
115c0 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
115d0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
115e0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
115f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
11600 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
11610 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
11620 65 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  e pNC->nDepth==0
11630 20 74 65 73 74 20 63 61 75 73 65 73 20 61 67 67   test causes agg
11640 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
11650 20 69 6e 20 73 75 62 71 75 65 72 69 65 73 0a 20   in subqueries. 
11660 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 67       ** to be ig
11670 6e 6f 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  nored */.      i
11680 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d  f( pNC->nDepth==
11690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
116a0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
116b0 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
116c0 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
116d0 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
116e0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
116f0 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
11700 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
11710 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
11720 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
11730 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
11740 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
11750 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
11760 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
11770 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
11780 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
11790 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
117a0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
117b0 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
117c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
117d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
117e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
117f0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
11800 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
11810 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
11820 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
11830 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
11840 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
11850 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
11860 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
11870 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
11880 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
11890 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
118a0 6f 46 75 6e 63 28 70 41 67 67 49 6e 66 6f 29 3b  oFunc(pAggInfo);
118b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
118c0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
118d0 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
118e0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
118f0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
11900 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
11910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
11920 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  tem->iMem = pPar
11930 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
11940 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
11950 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69  Func = sqlite3Fi
11960 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
11970 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  e->db,.         
11980 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
11990 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
119a0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
119b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119c0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
119d0 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
119e0 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
119f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
11a00 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
11a10 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20  s & EP_Distinct 
11a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
11a30 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63   pItem->iDistinc
11a40 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
11a50 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
11a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11a70 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
11a80 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
11a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
11ab0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
11ac0 70 45 78 70 72 20 70 6f 69 6e 74 20 74 6f 20 74  pExpr point to t
11ad0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70  he appropriate p
11ae0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d  AggInfo->aFunc[]
11af0 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20 2a   entry.        *
11b00 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  /.        pExpr-
11b10 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
11b20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
11b30 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
11b40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
11b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11b60 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 75 72 73 69   }..  /* Recursi
11b70 76 65 6c 79 20 77 61 6c 6b 20 73 75 62 71 75 65  vely walk subque
11b80 72 69 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ries looking for
11b90 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
11ba0 20 74 68 61 74 20 6e 65 65 64 0a 20 20 2a 2a 20   that need.  ** 
11bb0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  to be changed to
11bc0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20   TK_AGG_COLUMN. 
11bd0 20 42 75 74 20 69 6e 63 72 65 6d 65 6e 74 20 6e   But increment n
11be0 44 65 70 74 68 20 73 6f 20 74 68 61 74 0a 20 20  Depth so that.  
11bf0 2a 2a 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ** TK_AGG_FUNCTI
11c00 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 73 75 62 71  ON nodes in subq
11c10 75 65 72 69 65 73 20 77 69 6c 6c 20 62 65 20 75  ueries will be u
11c20 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
11c30 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
11c40 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  ect ){.    pNC->
11c50 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61  nDepth++;.    wa
11c60 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45 78  lkSelectExpr(pEx
11c70 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61  pr->pSelect, ana
11c80 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
11c90 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  NC);.    pNC->nD
11ca0 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  epth--;.  }.  re
11cb0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11cc0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
11cd0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
11ce0 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
11cf0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
11d00 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
11d10 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
11d20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
11d30 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
11d40 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
11d50 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
11d60 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
11d70 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
11d80 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
11d90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
11da0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
11db0 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
11dc0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
11dd0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
11de0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
11df0 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  lveNames()..**.*
11e00 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
11e10 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
11e20 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
11e30 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
11e40 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
11e50 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
11e60 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
11e70 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
11e80 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
11e90 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
11ea0 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e 43    int nErr = pNC
11eb0 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  ->pParse->nErr;.
11ec0 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
11ed0 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67  Expr, analyzeAgg
11ee0 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
11ef0 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61 72  return pNC->pPar
11f00 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b  se->nErr - nErr;
11f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
11f20 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
11f30 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
11f40 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
11f50 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
11f60 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
11f70 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
11f80 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
11f90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
11fa0 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
11fb0 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
11fc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11fd0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
11fe0 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
11ff0 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
12000 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
12010 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
12020 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
12030 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
12040 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
12050 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
12060 74 2d 3e 61 2c 20 69 3d 30 3b 20 6e 45 72 72 3d  t->a, i=0; nErr=
12070 3d 30 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  =0 && i<pList->n
12080 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
12090 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 45 72 72 20  ++){.      nErr 
120a0 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  += sqlite3ExprAn
120b0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
120c0 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  pNC, pItem->pExp
120d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
120e0 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a     return nErr;.}.