/ Hex Artifact Content
Login

Artifact c71265b78d383382fa8798ac9436246e3eb6d16c:


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 31 34 20 32 30 30 35 2f 30 37 2f 32 39 20  .214 2005/07/29 
0220: 31 35 3a 31 30 3a 31 38 20 64 72 68 20 45 78 70  15:10:18 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 20 6f 72 0a 20  has numeric or. 
0930: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66     ** integer af
0940: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
0950: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
0960: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
0970: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31   */.    if( aff1
0980: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
0990: 45 47 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51  EGER || aff2==SQ
09a0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
09b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
09c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
09d0: 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  GER;.    }else i
09e0: 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f  f( aff1==SQLITE_
09f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
0a00: 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff2==SQLITE_AFF_
0a10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
0a20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0a30: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
0a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
0a50: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0a60: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
0a70: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0a80: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0a90: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0aa0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0ab0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0ac0: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0ad0: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0ae0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20  ..    */.    /* 
0af0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0b00: 46 5f 4e 55 4d 45 52 49 43 3b 20 20 2f 2f 20 54  F_NUMERIC;  // T
0b10: 69 63 6b 65 74 20 23 38 30 35 20 2a 2f 0a 20 20  icket #805 */.  
0b20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0b30: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
0b40: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
0b50: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
0b60: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
0b70: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
0b80: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
0b90: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
0ba0: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
0bb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
0bc0: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
0bd0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0be0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0bf0: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
0c00: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
0c10: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
0c20: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
0c30: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
0c40: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
0c50: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
0c60: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
0c70: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
0c80: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
0c90: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
0ca0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0cb0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
0cc0: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
0cd0: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
0ce0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
0cf0: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
0d00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
0d10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
0d20: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0d30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29  xpr->op==TK_NE )
0d40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
0d50: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
0d60: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
0d70: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
0d80: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
0d90: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
0da0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
0db0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
0dc0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
0dd0: 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69  f);.  }.  else i
0de0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
0df0: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
0e00: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
0e10: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65  inity(pExpr->pSe
0e20: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0e30: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
0e40: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21    }.  else if( !
0e50: 61 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d  aff ){.    aff =
0e60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
0e70: 52 49 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  RIC;.  }.  retur
0e80: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
0e90: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
0ea0: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
0eb0: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
0ec0: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
0ed0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
0ee0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
0ef0: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
0f00: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
0f10: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
0f20: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
0f30: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
0f40: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
0f50: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
0f60: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
0f70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
0f80: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
0f90: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
0fa0: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
0fb0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
0fc0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
0fd0: 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a  xpr);.  return .
0fe0: 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45      (aff==SQLITE
0ff0: 5f 41 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20  _AFF_NONE) ||.  
1000: 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41    (aff==SQLITE_A
1010: 46 46 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64  FF_NUMERIC && id
1020: 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  x_affinity==SQLI
1030: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20  TE_AFF_INTEGER) 
1040: 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c  ||.    (aff==SQL
1050: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
1060: 26 26 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  && idx_affinity=
1070: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
1080: 52 49 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66  RIC) ||.    (aff
1090: 3d 3d 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  ==idx_affinity);
10a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10b0: 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 74 68   the P1 value th
10c0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
10d0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
10e0: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
10f0: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
1100: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
1110: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1120: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66  nd pExpr2..** If
1130: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74   jumpIfNull is t
1140: 72 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68  rue, then set th
1150: 65 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68  e low byte of th
1160: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31  e returned.** P1
1170: 20 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74   value to tell t
1180: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d  he opcode to jum
1190: 70 20 69 66 20 65 69 74 68 65 72 20 65 78 70 72  p if either expr
11a0: 65 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61  ession.** evalua
11b0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a  tes to NULL..*/.
11c0: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72  static int binar
11d0: 79 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20  yCompareP1(Expr 
11e0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
11f0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
1200: 66 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61  fNull){.  char a
1210: 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
1220: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
1230: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e 74  ;.  return ((int
1240: 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41  )sqlite3CompareA
1250: 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20  ffinity(pExpr1, 
1260: 61 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75 6c  aff))+(jumpIfNul
1270: 6c 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f  l?0x100:0);.}../
1280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1290: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c  inter to the col
12a0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12b0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
12c0: 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61  sed by.** a bina
12d0: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  ry comparison op
12e0: 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67  erator comparing
12f0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
1300: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1310: 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73  left hand expres
1320: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1330: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79  ting sequence ty
1340: 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a  pe, then it is.*
1350: 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73  * used. Otherwis
1360: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
1370: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
1380: 20 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72   right hand expr
1390: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65  ession.** is use
13a0: 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c  d, or the defaul
13b0: 74 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65  t (BINARY) if ne
13c0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
13d0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
13e0: 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  .** type..*/.sta
13f0: 74 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e  tic CollSeq* bin
1400: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1410: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
1420: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
1430: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43  pr *pRight){.  C
1440: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1450: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1460: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
1470: 29 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  );.  if( !pColl 
1480: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
1490: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
14a0: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
14b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14c0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
14d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
14e0: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
14f0: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
1500: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
1510: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
1520: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
1530: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
1540: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
1550: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1560: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
1570: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
1580: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
1590: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
15a0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
15b0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
15c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
15d0: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
15e0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
15f0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1600: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
1610: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1620: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
1630: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
1640: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
1650: 7b 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e  {.  int p1 = bin
1660: 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65  aryCompareP1(pLe
1670: 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70  ft, pRight, jump
1680: 49 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53  IfNull);.  CollS
1690: 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43  eq *p3 = binaryC
16a0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
16b0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
16c0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ght);.  return s
16d0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 50  qlite3VdbeOp3(pP
16e0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
16f0: 6f 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28  ode, p1, dest, (
1700: 76 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c  void*)p3, P3_COL
1710: 4c 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSEQ);.}../*.** 
1720: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
1730: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1740: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1750: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
1760: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
1770: 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64  node is obtained
1780: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1790: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
17a0: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
17b0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
17c0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
17d0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
17e0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f  y gets freed..*/
17f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1800: 70 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20  pr(int op, Expr 
1810: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
1820: 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65  ight, const Toke
1830: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
1840: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
1850: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1860: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
1870: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1880: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61  {.    /* When ma
1890: 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65  lloc fails, dele
18a0: 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  te pLeft and pRi
18b0: 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73  ght. Expressions
18c0: 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20   passed to .    
18d0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
18e0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
18f0: 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73  allocated with s
1900: 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72  qlite3Expr() for
1910: 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65   this .    ** re
1920: 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ason. .    */.  
1930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1940: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
1950: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1960: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  e(pRight);.    r
1970: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1980: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
1990: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
19a0: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
19b0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
19c0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
19d0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
19e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
19f0: 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20  ken->dyn==0 );. 
1a00: 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20     pNew->span = 
1a10: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
1a20: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  Token;.  }else i
1a30: 66 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67  f( pLeft && pRig
1a40: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
1a50: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
1a60: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
1a70: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
1a80: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
1a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  .}../*.** When d
1aa0: 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61  oing a nested pa
1ab0: 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63  rse, you can inc
1ac0: 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  lude terms in an
1ad0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
1ae0: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
1af0: 69 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e  is:   #0 #1 #2 .
1b00: 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  ..  These terms 
1b10: 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74  refer to element
1b20: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  s.** on the stac
1b30: 6b 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74  k.  "#0" means t
1b40: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
1b50: 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61  ack..** "#1" mea
1b60: 6e 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e  ns the next down
1b70: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
1b80: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
1b90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ba0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1bb0: 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c  e parser to deal
1bc0: 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73   with on of thos
1bd0: 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69  e terms..** It i
1be0: 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72  mmediately gener
1bf0: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f  ates code to sto
1c00: 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
1c10: 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  a memory locatio
1c20: 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  n..** The return
1c30: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
1c40: 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74  that will code t
1c50: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1c60: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74  lue from.** that
1c70: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1c80: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45   as needed..*/.E
1c90: 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69  xpr *sqlite3Regi
1ca0: 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20 2a  sterExpr(Parse *
1cb0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1cc0: 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a  Token){.  Vdbe *
1cd0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ce0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  e;.  Expr *p;.  
1cf0: 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28  int depth;.  if(
1d00: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
1d10: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1d20: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
1d30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d40: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
1d50: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
1d60: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
1d70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1d80: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
1d90: 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c 20  pr(TK_REGISTER, 
1da0: 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  0, 0, pToken);. 
1db0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
1dc0: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d   return 0;  /* M
1dd0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
1de0: 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61 74    }.  depth = at
1df0: 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  oi(&pToken->z[1]
1e00: 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  );.  p->iTable =
1e10: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
1e20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1e30: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64  dOp(v, OP_Dup, d
1e40: 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69  epth, 0);.  sqli
1e50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1e60: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e  OP_MemStore, p->
1e70: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65  iTable, 1);.  re
1e80: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1e90: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
1ea0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
1eb0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
1ec0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1ed0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
1ee0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1ef0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
1f00: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
1f10: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
1f20: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1f30: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
1f40: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
1f50: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
1f60: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1f70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1f80: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
1f90: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
1fa0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1fb0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1fc0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1fd0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
1fe0: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
1ff0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2000: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
2010: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
2020: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
2030: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
2040: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
2050: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
2060: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
2070: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
2080: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2090: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
20a0: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
20b0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
20c0: 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26   && pRight->z &&
20d0: 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20   pLeft->z ){.   
20e0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
20f0: 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d  dyn==0 || pLeft-
2100: 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20  >z[pLeft->n]==0 
2110: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
2120: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
2130: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
2140: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2150: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
2160: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2170: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
2180: 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65  (pRight->z - pLe
2190: 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ft->z);.    }els
21a0: 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e{.      pExpr->
21b0: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  span.z = 0;.    
21c0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
21d0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
21e0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
21f0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
2200: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
2210: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
2220: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
2230: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
2240: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
2250: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
2260: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73  pNew;.  pNew = s
2270: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
2280: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
2290: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22b0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 20  tDelete(pList); 
22c0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
22d0: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
22e0: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
22f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2300: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
2310: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
2320: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
2330: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
2340: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
2350: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
2360: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
2370: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65  *pToken;.  }else
2380: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
2390: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  n.z = 0;.  }.  p
23a0: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
23b0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72  ->token;.  retur
23c0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
23d0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
23e0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
23f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
2400: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
2410: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
2420: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
2430: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
2440: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
2450: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
2460: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
2470: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
2480: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
2490: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
24a0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
24b0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
24c0: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
24d0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
24e0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
24f0: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
2500: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
2510: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
2520: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
2530: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
2540: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
2550: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
2560: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
2570: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
2580: 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69   "$aaa" are assi
2590: 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75  gned the same nu
25a0: 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70  mber.** as the p
25b0: 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65  revious instance
25c0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c   of the same wil
25d0: 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68  dcard.  Or if th
25e0: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
25f0: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
2600: 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65  he wildcard, the
2610: 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20   next sequenial 
2620: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2630: 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a  is.** assigned..
2640: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2650: 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62  xprAssignVarNumb
2660: 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
2670: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2680: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b    Token *pToken;
2690: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
26a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
26b0: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
26c0: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
26d0: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
26e0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
26f0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
2700: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
2710: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
2720: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
2730: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2740: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
2750: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
2760: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2770: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2780: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
2790: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
27a0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
27b0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
27c0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
27d0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
27e0: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
27f0: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
2800: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
2810: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
2820: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
2830: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2840: 20 69 20 3d 20 61 74 6f 69 28 26 70 54 6f 6b 65   i = atoi(&pToke
2850: 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 69 66  n->z[1]);.    if
2860: 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c 49 54  ( i<1 || i>SQLIT
2870: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
2880: 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20 20 73  UMBER ){.      s
2890: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28a0: 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65  Parse, "variable
28b0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20   number must be 
28c0: 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f  between ?1 and ?
28d0: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 53  %d",.          S
28e0: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
28f0: 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 20 20  LE_NUMBER);.    
2900: 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72  }.    if( i>pPar
2910: 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20  se->nVar ){.    
2920: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
2930: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   i;.    }.  }els
2940: 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  e{.    /* Wildca
2950: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
2960: 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22  ":aaa" or "$aaa"
2970: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
2980: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  e variable.    *
2990: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
29a0: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
29b0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
29c0: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
29d0: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76  e.    ** has nev
29e0: 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f  er appeared befo
29f0: 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61  re, reuse the sa
2a00: 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  me variable numb
2a10: 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  er.    */.    in
2a20: 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
2a30: 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66  pToken->n;.    f
2a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
2a50: 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b 29  ->nVarExpr; i++)
2a60: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
2a70: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 20  ;.      if( (pE 
2a80: 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  = pParse->apVarE
2a90: 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20  xpr[i])!=0.     
2aa0: 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65       && pE->toke
2ab0: 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20  n.n==n.         
2ac0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74   && memcmp(pE->t
2ad0: 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  oken.z, pToken->
2ae0: 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  z, n)==0 ){.    
2af0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2b00: 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a  e = pE->iTable;.
2b10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b30: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
2b40: 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20  nVarExpr ){.    
2b50: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2b60: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  = ++pParse->nVar
2b70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
2b80: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50  se->nVarExpr>=pP
2b90: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
2ba0: 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  loc-1 ){.       
2bb0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
2bc0: 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65  rAlloc += pParse
2bd0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20  ->nVarExprAlloc 
2be0: 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50  + 10;.        pP
2bf0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20  arse->apVarExpr 
2c00: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
2c10: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2c20: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2c30: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
2c40: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
2c50: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
2c60: 70 56 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a  pVarExpr[0]) );.
2c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c80: 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ( !sqlite3_mallo
2c90: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
2ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
2cb0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30  se->apVarExpr!=0
2cc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
2cd0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50  se->apVarExpr[pP
2ce0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b  arse->nVarExpr++
2cf0: 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  ] = pExpr;.     
2d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a   }.    }.  } .}.
2d10: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
2d20: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
2d30: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
2d40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2d50: 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29  rDelete(Expr *p)
2d60: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
2d70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
2d80: 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  span.dyn ) sqlit
2d90: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  eFree((char*)p->
2da0: 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70  span.z);.  if( p
2db0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71  ->token.dyn ) sq
2dc0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
2dd0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73  p->token.z);.  s
2de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2df0: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71  (p->pLeft);.  sq
2e00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2e10: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71  p->pRight);.  sq
2e20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2e30: 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  ete(p->pList);. 
2e40: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2e50: 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29  lete(p->pSelect)
2e60: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
2e70: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
2e80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
2e90: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
2ea0: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
2eb0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
2ec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
2ed0: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
2ee0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
2ef0: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
2f00: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
2f10: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
2f20: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
2f30: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
2f40: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
2f50: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
2f60: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
2f70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
2f80: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
2f90: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
2fa0: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
2fb0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
2fc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
2fd0: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
2fe0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
2ff0: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
3000: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
3010: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
3020: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
3030: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
3040: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
3050: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
3060: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
3070: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
3080: 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70  plicated..*/.Exp
3090: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
30a0: 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78  p(Expr *p){.  Ex
30b0: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  pr *pNew;.  if( 
30c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
30d0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
30e0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
30f0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
3100: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3110: 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  0;.  memcpy(pNew
3120: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , p, sizeof(*pNe
3130: 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  w));.  if( p->to
3140: 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  ken.z!=0 ){.    
3150: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  pNew->token.z = 
3160: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 2d  sqliteStrNDup(p-
3170: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b  >token.z, p->tok
3180: 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  en.n);.    pNew-
3190: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a  >token.dyn = 1;.
31a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
31b0: 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  ert( pNew->token
31c0: 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  .z==0 );.  }.  p
31d0: 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b  New->span.z = 0;
31e0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d  .  pNew->pLeft =
31f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3200: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65  p->pLeft);.  pNe
3210: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
3220: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 52  te3ExprDup(p->pR
3230: 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ight);.  pNew->p
3240: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
3250: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c 69  prListDup(p->pLi
3260: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65  st);.  pNew->pSe
3270: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
3280: 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c 65  lectDup(p->pSele
3290: 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 54 61  ct);.  pNew->pTa
32a0: 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20 72  b = p->pTab;.  r
32b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f  eturn pNew;.}.vo
32c0: 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43  id sqlite3TokenC
32d0: 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  opy(Token *pTo, 
32e0: 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20  Token *pFrom){. 
32f0: 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20   if( pTo->dyn ) 
3300: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
3310: 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28  *)pTo->z);.  if(
3320: 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20   pFrom->z ){.   
3330: 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d   pTo->n = pFrom-
3340: 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  >n;.    pTo->z =
3350: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
3360: 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e  From->z, pFrom->
3370: 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e  n);.    pTo->dyn
3380: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3390: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20     pTo->z = 0;. 
33a0: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
33b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
33c0: 70 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a  p(ExprList *p){.
33d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
33e0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
33f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
3400: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
3410: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3420: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3430: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3440: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
3450: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3460: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3470: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e  pNew->nExpr = pN
3480: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3490: 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61  nExpr;.  pNew->a
34a0: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
34b0: 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70  eMalloc( p->nExp
34c0: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  r*sizeof(p->a[0]
34d0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
34e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
34f0: 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
3500: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
3510: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
3520: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
3530: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
3540: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
3550: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3560: 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78  NewExpr, *pOldEx
3570: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
3580: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
3590: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
35a0: 28 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  (pOldExpr = pOld
35b0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
35c0: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e    if( pOldExpr->
35d0: 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65  span.z!=0 && pNe
35e0: 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f  wExpr ){.      /
35f0: 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20  * Always make a 
3600: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e  copy of the span
3610: 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65   for top-level e
3620: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
3630: 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
3640: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
3650: 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54   logic in SELECT
3660: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
3670: 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20   determines.    
3680: 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f    ** the names o
3690: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
36a0: 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64   result set need
36b0: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
36c0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
36d0: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e  te3TokenCopy(&pN
36e0: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
36f0: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
3700: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
3710: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
3720: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
3730: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
3740: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
3750: 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69  pan.z==0 || sqli
3760: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
3770: 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  d );.    pItem->
3780: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
3790: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
37a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
37b0: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
37c0: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
37d0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73  r;.    pItem->is
37e0: 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Agg = pOldItem->
37f0: 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d  isAgg;.    pItem
3800: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ->done = 0;.  }.
3810: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3820: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
3830: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
3840: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
3850: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
3860: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
3870: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
3880: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3890: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
38a0: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
38b0: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
38c0: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
38d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
38e0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
38f0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
3900: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
3910: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
3920: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
3930: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
3940: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
3950: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
3960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
3970: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
3980: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
3990: 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53  SrcList *p){.  S
39a0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
39b0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
39c0: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
39d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
39e0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
39f0: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
3a00: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
3a10: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
3a20: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
3a30: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79  teMallocRaw( nBy
3a40: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
3a50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3a60: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
3a70: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
3a80: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
3a90: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
3aa0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
3ab0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
3ac0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
3ad0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
3ae0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
3af0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
3b00: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
3b10: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
3b20: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
3b30: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
3b40: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
3b50: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
3b60: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
3b70: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  up(pOldItem->zNa
3b80: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
3b90: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
3ba0: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3bb0: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
3bc0: 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pNewItem->jointy
3bd0: 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a  pe = pOldItem->j
3be0: 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65  ointype;.    pNe
3bf0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
3c00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
3c10: 6f 72 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  or;.    pTab = p
3c20: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
3c30: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
3c40: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
3c50: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
3c60: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
3c70: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
3c80: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
3c90: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  up(pOldItem->pSe
3ca0: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49  lect);.    pNewI
3cb0: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
3cc0: 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74  e3ExprDup(pOldIt
3cd0: 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e  em->pOn);.    pN
3ce0: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
3cf0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
3d00: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  p(pOldItem->pUsi
3d10: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
3d20: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
3d30: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
3d40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3d50: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
3d60: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64  ite3IdListDup(Id
3d70: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
3d80: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
3d90: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
3da0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3db0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
3dc0: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  aw( sizeof(*pNew
3dd0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
3de0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3df0: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65   pNew->nId = pNe
3e00: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
3e10: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
3e20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3e30: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
3e40: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
3e50: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
3e60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e     sqliteFree(pN
3e70: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
3e80: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
3e90: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
3ea0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
3eb0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
3ec0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
3ed0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
3ee0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
3ef0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
3f00: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
3f10: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
3f20: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
3f30: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
3f40: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
3f50: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
3f60: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
3f70: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
3f80: 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b  tDup(Select *p){
3f90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
3fa0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
3fb0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
3fc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3fd0: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
3fe0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
3ff0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4000: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
4010: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
4020: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
4030: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4040: 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  p(p->pEList);.  
4050: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
4060: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70  ite3SrcListDup(p
4070: 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d  ->pSrc);.  pNew-
4080: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
4090: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65  3ExprDup(p->pWhe
40a0: 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  re);.  pNew->pGr
40b0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
40c0: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47  xprListDup(p->pG
40d0: 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d  roupBy);.  pNew-
40e0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
40f0: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61  e3ExprDup(p->pHa
4100: 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ving);.  pNew->p
4110: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
4120: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
4130: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65  pOrderBy);.  pNe
4140: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
4150: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
4160: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4170: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70  (p->pPrior);.  p
4180: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
4190: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
41a0: 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d  pLimit);.  pNew-
41b0: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
41c0: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4f 66  e3ExprDup(p->pOf
41d0: 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69  fset);.  pNew->i
41e0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e  Limit = -1;.  pN
41f0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31  ew->iOffset = -1
4200: 3b 0a 20 20 70 4e 65 77 2d 3e 70 70 4f 70 65 6e  ;.  pNew->ppOpen
4210: 56 69 72 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70  Virtual = 0;.  p
4220: 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20  New->isResolved 
4230: 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 3b  = p->isResolved;
4240: 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20 3d  .  pNew->isAgg =
4250: 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 72 65 74   p->isAgg;.  ret
4260: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
4270: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
4280: 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63  3SelectDup(Selec
4290: 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t *p){.  assert(
42a0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
42b0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
42c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
42d0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
42e0: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
42f0: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
4300: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
4310: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
4320: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
4330: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
4340: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
4350: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
4360: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
4370: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f   Expr *pExpr, To
4380: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4390: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
43a0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
43b0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
43c0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
43d0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
43e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
43f0: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  em;.    }.    as
4400: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c  sert( pList->nAl
4410: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  loc==0 );.  }.  
4420: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  if( pList->nAllo
4430: 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  c<=pList->nExpr 
4440: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
4450: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
4460: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
4470: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
4480: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
4490: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
44a0: 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d   n*sizeof(pList-
44b0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
44c0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
44d0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
44e0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
44f0: 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   a;.    pList->n
4500: 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20  Alloc = n;.  }. 
4510: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
4520: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  a!=0 );.  if( pE
4530: 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a  xpr || pName ){.
4540: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
4550: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
4560: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
4570: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
4580: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
4590: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
45a0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
45b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
45c0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
45d0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
45e0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
45f0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
4600: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
4610: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
4620: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
4630: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
4640: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
4650: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
4660: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4670: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
4680: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4690: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
46a0: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
46b0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
46c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
46d0: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
46e0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
46f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
4700: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
4710: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
4720: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4730: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28  pList->a!=0 || (
4740: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
4750: 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  && pList->nAlloc
4760: 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
4770: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  ( pList->nExpr<=
4780: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b  pList->nAlloc );
4790: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
47a0: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
47b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
47c0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
47d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
47e0: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  (pItem->pExpr);.
47f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4800: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
4810: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4820: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
4830: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
4840: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
4850: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
4860: 20 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72    Call xFunc for
4870: 20 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74   each node visit
4880: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
4890: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
48a0: 78 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73  xFunc determines
48b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65   whether the tre
48c0: 65 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73  e walk continues
48d0: 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e  ..** 0 means con
48e0: 74 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68  tinue walking th
48f0: 65 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73  e tree.  1 means
4900: 20 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69   do not walk chi
4910: 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ldren.** of the 
4920: 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74  current node but
4930: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73   continue with s
4940: 69 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e  iblings.  2 mean
4950: 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65  s abandon.** the
4960: 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c   tree walk compl
4970: 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etely..**.** The
4980: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
4990: 6f 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  om this routine 
49a0: 69 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20  is 1 to abandon 
49b0: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a  the tree walk.**
49c0: 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e   and 0 to contin
49d0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
49e0: 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45  t walkExprList(E
49f0: 78 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28  xprList *, int (
4a00: 2a 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  *)(void *, Expr*
4a10: 29 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74  ), void *);.stat
4a20: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54  ic int walkExprT
4a30: 72 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ree(Expr *pExpr,
4a40: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
4a50: 69 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64  id*,Expr*), void
4a60: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
4a70: 63 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  c;.  if( pExpr==
4a80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4a90: 72 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41  rc = (*xFunc)(pA
4aa0: 72 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  rg, pExpr);.  if
4ab0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
4ac0: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
4ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46  pExpr->pLeft, xF
4ae0: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4af0: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77  urn 1;.    if( w
4b00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
4b10: 72 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63  r->pRight, xFunc
4b20: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
4b30: 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   1;.    if( walk
4b40: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
4b50: 70 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41  pList, xFunc, pA
4b60: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e    }.  return rc>
4b80: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  1;.}../*.** Call
4b90: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
4ba0: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
4bb0: 73 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a  sion in list p..
4bc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
4bd0: 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  lkExprList(ExprL
4be0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ist *p, int (*xF
4bf0: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
4c00: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
4c10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
4c20: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4c30: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
4c40: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
4c50: 20 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c   for(i=p->nExpr,
4c60: 20 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30   pItem=p->a; i>0
4c70: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
4c80: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4c90: 72 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78  rTree(pItem->pEx
4ca0: 70 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  pr, xFunc, pArg)
4cb0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
4cc0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4cd0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45  /*.** Call walkE
4ce0: 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76  xprTree() for ev
4cf0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
4d00: 6e 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20  n Select p, not 
4d10: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70  including.** exp
4d20: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
4d30: 65 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65  e part of sub-se
4d40: 6c 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f  lects in any FRO
4d50: 4d 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20  M clause or the 
4d60: 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53  LIMIT.** or OFFS
4d70: 45 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e  ET expressions..
4d80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4d90: 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65  alkSelectExpr(Se
4da0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78  lect *p, int (*x
4db0: 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78  Func)(void *, Ex
4dc0: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  pr*), void *pArg
4dd0: 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  ){.  walkExprLis
4de0: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75  t(p->pEList, xFu
4df0: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
4e00: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68  kExprTree(p->pWh
4e10: 65 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ere, xFunc, pArg
4e20: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  );.  walkExprLis
4e30: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78  t(p->pGroupBy, x
4e40: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
4e50: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70  alkExprTree(p->p
4e60: 48 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70  Having, xFunc, p
4e70: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
4e80: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
4e90: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
4ea0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
4eb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4ec0: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
4ed0: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
4ee0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
4ef0: 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61  *.** pArg is rea
4f00: 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
4f10: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66   an integer.  If
4f20: 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20   we can tell by 
4f30: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45  looking.** at pE
4f40: 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70  xpr that the exp
4f50: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
4f60: 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e  tains pExpr is n
4f70: 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ot a constant.**
4f80: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4f90: 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30  n set *pArg to 0
4fa0: 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f   and return 2 to
4fb0: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
4fc0: 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45  e walk..** If pE
4fd0: 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f  xpr does does no
4fe0: 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65  t disqualify the
4ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
5000: 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e   being a constan
5010: 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74  t.** then do not
5020: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  hing..**.** Afte
5030: 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68  r walking the wh
5040: 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20  ole tree, if no 
5050: 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20  nodes are found 
5060: 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a  that disqualify.
5070: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
5080: 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n as constant, t
5090: 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68  hen we assume th
50a0: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
50b0: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e  on.** is constan
50c0: 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  t.  See sqlite3E
50d0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
50e0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
50f0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
5100: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
5110: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69  deIsConstant(voi
5120: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
5130: 45 78 70 72 29 7b 0a 20 20 73 77 69 74 63 68 28  Expr){.  switch(
5140: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
5150: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
5160: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
5170: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
5180: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
5190: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
51a0: 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a  * and *pArg==2 *
51b0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
51c0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
51d0: 28 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 3d  ( *((int*)pArg)=
51e0: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
51f0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
5200: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
5210: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
5220: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
5230: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20  case TK_DOT:.   
5240: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
5250: 43 54 49 4f 4e 3a 0a 23 69 66 6e 64 65 66 20 53  CTION:.#ifndef S
5260: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5270: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
5280: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
5290: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64   TK_EXISTS:.#end
52a0: 69 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a  if.      *((int*
52b0: 29 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20  )pArg) = 0;.    
52c0: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
52d0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
52e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
52f0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
5300: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5310: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
5320: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
5330: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
5340: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
5350: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
5360: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
5370: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
5380: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
5390: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
53a0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
53b0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
53c0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
53d0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
53e0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
53f0: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
5400: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
5410: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
5420: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
5430: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5440: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
5450: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
5460: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
5470: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
5480: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
5490: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
54a0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
54b0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
54c0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
54d0: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
54e0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
54f0: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
5500: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
5510: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
5520: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
5530: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
5540: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
5550: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
5560: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
5570: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
5580: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
5590: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
55a0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
55b0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
55c0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
55d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
55e0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
55f0: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
5600: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
5610: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
5620: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
5630: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
5640: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
5650: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
5660: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
5670: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
5680: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
5690: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
56a0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
56b0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
56c0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
56d0: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
56e0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
56f0: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
5700: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5710: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
5720: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
5730: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
5740: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
5750: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
5760: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
5770: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
5780: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5790: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
57a0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
57b0: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
57c0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
57d0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
57e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
57f0: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b  3GetInt32(p->tok
5800: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b  en.z, pValue) ){
5810: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5820: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5840: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
5850: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
5860: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
5870: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
5880: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Value);.    }.  
5890: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
58a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
58b0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
58c0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
58d0: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
58e0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
58f0: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
5900: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5910: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5920: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5930: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
5940: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5950: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5960: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
5970: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
5980: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
5990: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
59a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
59b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
59c0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
59d0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
59e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
59f0: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
5a00: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
5a10: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
5a20: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
5a30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
5a40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5a50: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
5a60: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
5a70: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
5a80: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
5a90: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
5aa0: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
5ab0: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
5ac0: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
5ad0: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
5ae0: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
5af0: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
5b00: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
5b10: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
5b20: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
5b30: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
5b40: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
5b50: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
5b60: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
5b70: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
5b80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5b90: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  holding.**      
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a     the table..**
5bc0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
5bd0: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
5be0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
5bf0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5c00: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
5c30: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
5c40: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
5c50: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
5c60: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
5c70: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
5c80: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
5c90: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
5ca0: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
5cb0: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
5cc0: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
5cd0: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
5ce0: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
5cf0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
5d00: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
5d10: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
5d20: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
5d30: 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65  *.** The pDbToke
5d40: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
5d50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
5d60: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
5d70: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
5d80: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
5d90: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
5da0: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
5db0: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
5dc0: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
5dd0: 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62   used.  The pTab
5de0: 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  leToken is the n
5df0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5e00: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
5e10: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
5e20: 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b  e NULL if pDbTok
5e30: 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  en is also NULL.
5e40: 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e    If pTableToken
5e50: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
5e60: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
5e70: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
5e80: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
5e90: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
5ea0: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
5eb0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
5ec0: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
5ed0: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
5ee0: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
5ef0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
5f00: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
5f10: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
5f20: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e    Return zero on
5f30: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
5f40: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
5f50: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
5f60: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
5f70: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
5f80: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
5f90: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
5fa0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
5fb0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
5fc0: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
5fd0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
5fe0: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
5ff0: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
6000: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
6010: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
6020: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
6030: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
6040: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
6050: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
6060: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
6070: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
6080: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
6090: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
60a0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
60b0: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
60c0: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
60d0: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
60e0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
60f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
6100: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
6110: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
6120: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
6130: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
6140: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
6150: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
6160: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
6170: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
6180: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
6190: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
61a0: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
61b0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
61c0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
61d0: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
61e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
61f0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
6200: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
6210: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
6220: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6230: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
6240: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
6250: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6260: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
6270: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72  atabase */.  str
6280: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
6290: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
62a0: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
62b0: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
62c0: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
62d0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
62e0: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
62f0: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
6300: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
6310: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
6320: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
6330: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
6340: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
6350: 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
6360: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26   pColumnToken &&
6370: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
6380: 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20   ); /* The Z in 
6390: 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20  X.Y.Z cannot be 
63a0: 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20  NULL */.  zDb = 
63b0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
63c0: 6f 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a  oken(pDbToken);.
63d0: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33    zTab = sqlite3
63e0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
63f0: 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43  ableToken);.  zC
6400: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
6410: 46 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d  FromToken(pColum
6420: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73  nToken);.  if( s
6430: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
6440: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
6450: 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b   lookupname_end;
6460: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69  .  }..  pExpr->i
6470: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68  Table = -1;.  wh
6480: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
6490: 3d 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  =0 ){.    SrcLis
64a0: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
64b0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
64c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
64d0: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
64e0: 0a 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ..    /* assert(
64f0: 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69   zTab==0 || pELi
6500: 73 74 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20  st==0 ); */.    
6510: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
6520: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
6530: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
6540: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
6550: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
6560: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
6570: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
6580: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 43 6f  pTab;.        Co
6590: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20  lumn *pCol;.  . 
65a0: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d         if( pTab=
65b0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
65c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
65d0: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
65e0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20         if( zTab 
65f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6600: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
6610: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
6620: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
6630: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
6640: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
6650: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
6660: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
6670: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6690: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
66a0: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
66b0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
66c0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
66d0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
66e0: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
66f0: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
6700: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6710: 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71  if( zDb!=0 && sq
6720: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
6730: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
6740: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
6750: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6760: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6780: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6790: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e        if( 0==(cn
67a0: 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20  tTab++) ){.     
67b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
67c0: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
67d0: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sor;.          p
67e0: 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62  Expr->iDb = pTab
67f0: 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  ->iDb;.         
6800: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
6810: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6820: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c     for(j=0, pCol
6830: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
6840: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
6850: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
6860: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6870: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
6880: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
6890: 20 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73             IdLis
68a0: 74 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t *pUsing;.     
68b0: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
68c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
68d0: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
68e0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
68f0: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
6900: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Item;.          
6910: 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70    pExpr->iDb = p
6920: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20  Tab->iDb;.      
6930: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
6940: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
6950: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
6960: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
6970: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
6980: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6990: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
69a0: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
69b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
69c0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
69d0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
69e0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
69f0: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
6a00: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
6a10: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
6a20: 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e   if( pItem->join
6a30: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
6a40: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
6a50: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61     /* If this ma
6a60: 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20  tch occurred in 
6a70: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
6a80: 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e  f a natural join
6a90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6aa0: 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ** then skip the
6ab0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20   right table to 
6ac0: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
6ad0: 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  e match */.     
6ae0: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b           pItem++
6af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6b00: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
6b10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
6b20: 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74  f( (pUsing = pIt
6b30: 65 6d 2d 3e 70 55 73 69 6e 67 29 21 3d 30 20 29  em->pUsing)!=0 )
6b40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6b50: 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68  /* If this match
6b60: 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c   occurs on a col
6b70: 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74  umn that is in t
6b80: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  he USING clause.
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
6ba0: 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70   of a join, skip
6bb0: 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74   the search of t
6bc0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
6bd0: 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20  f the join.     
6be0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61           ** to a
6bf0: 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65  void a duplicate
6c00: 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f   match there. */
6c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
6c20: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
6c30: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
6c40: 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29  Using->nId; k++)
6c50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6c70: 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b  ICmp(pUsing->a[k
6c80: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
6c90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6ca0: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
6cd0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
6d00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
6d20: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
6d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6d40: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
6d50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
6d60: 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  GER.    /* If we
6d70: 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
6d80: 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e  y resolved the n
6d90: 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  ame, then maybe 
6da0: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20  .    ** it is a 
6db0: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
6dc0: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
6dd0: 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f  reference.    */
6de0: 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20  .    if( zDb==0 
6df0: 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e  && zTab!=0 && cn
6e00: 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  t==0 && pParse->
6e10: 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a  trigStack!=0 ){.
6e20: 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61        TriggerSta
6e30: 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63  ck *pTriggerStac
6e40: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  k = pParse->trig
6e50: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62  Stack;.      Tab
6e60: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
6e70: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
6e80: 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d  Stack->newIdx !=
6e90: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
6ea0: 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61  rICmp("new", zTa
6eb0: 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20  b) == 0 ){.     
6ec0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6ed0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
6ee0: 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20  ->newIdx;.      
6ef0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
6f00: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
6f10: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
6f20: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
6f30: 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Tab;.      }else
6f40: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61   if( pTriggerSta
6f50: 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31  ck->oldIdx != -1
6f60: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6f70: 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d  mp("old", zTab)=
6f80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
6f90: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54  xpr->iTable = pT
6fa0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
6fb0: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Idx;.        ass
6fc0: 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61  ert( pTriggerSta
6fd0: 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20  ck->pTab );.    
6fe0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67      pTab = pTrig
6ff0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a  gerStack->pTab;.
7000: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7010: 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20  f( pTab ){ .    
7020: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
7030: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
7040: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20  = pTab->aCol;.. 
7050: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
7060: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
7070: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
7080: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7090: 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  ; j < pTab->nCol
70a0: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b  ; j++, pCol++) {
70b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
70c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
70d0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
70e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
70f0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
7100: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
7110: 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e  lumn = j==pTab->
7120: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a  iPKey ? -1 : j;.
7130: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7140: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
7150: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69  ab->aCol[j].affi
7160: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nity;.          
7170: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
7180: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70   pTab->aCol[j].p
7190: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
71a0: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
71b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
71c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
71d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
71e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
71f0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
7200: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
7210: 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a  GER) */..    /*.
7220: 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74      ** Perhaps t
7230: 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66  he name is a ref
7240: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f  erence to the RO
7250: 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  WID.    */.    i
7260: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74  f( cnt==0 && cnt
7270: 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  Tab==1 && sqlite
7280: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29  3IsRowid(zCol) )
7290: 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b  {.      cnt = 1;
72a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
72b0: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
72c0: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
72d0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
72e0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20  NTEGER;.    }.. 
72f0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
7300: 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20  the input is of 
7310: 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20  the form Z (not 
7320: 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68  Y.Z or X.Y.Z) th
7330: 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20  en the name Z.  
7340: 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72    ** might refer
7350: 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65   to an result-se
7360: 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68  t alias.  This h
7370: 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
7380: 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  ple, when.    **
7390: 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e   we are resolvin
73a0: 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57  g names in the W
73b0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
73c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
73d0: 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mand:.    **.   
73e0: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
73f0: 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62  +b AS x FROM tab
7400: 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20  le WHERE x<10;. 
7410: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
7420: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c  cases like this,
7430: 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77   replace pExpr w
7440: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
7450: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
7460: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74  t.    ** forms t
7470: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e  he result set en
7480: 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68  try ("a+b" in th
7490: 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72  e example) and r
74a0: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
74b0: 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  y..    ** Note t
74c0: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
74d0: 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
74e0: 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65   set should have
74f0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
7500: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79    ** resolved by
7510: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48   the time the WH
7520: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65  ERE clause is re
7530: 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  solved..    */. 
7540: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
7550: 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 7a 54   pEList!=0 && zT
7560: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ab==0 ){.      f
7570: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
7580: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
7590: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73         char *zAs
75a0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
75b0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
75c0: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
75d0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
75e0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
75f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7600: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
7610: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
7620: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
7630: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
7640: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  S;.          pEx
7650: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  pr->iColumn = j;
7660: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
7670: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
7680: 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
7690: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
76a0: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b          cnt = 1;
76b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
76c0: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
76d0: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
76e0: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
76f0: 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20  e_end_2;.       
7700: 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
7710: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  }..    /* Advanc
7720: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61  e to the next na
7730: 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65  me context.  The
7740: 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20   loop will exit 
7750: 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20  when either.    
7760: 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74  ** we have a mat
7770: 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68  ch (cnt>0) or wh
7780: 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  en we run out of
7790: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a   name contexts..
77a0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
77b0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nt==0 ){.      p
77c0: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
77d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
77e0: 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59  .  ** If X and Y
77f0: 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74   are NULL (in ot
7800: 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c  her words if onl
7810: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
7820: 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70  e Z is.  ** supp
7830: 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61  lied) and the va
7840: 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c  lue of Z is encl
7850: 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71  osed in double-q
7860: 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a  uotes, then.  **
7870: 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c   Z is a string l
7880: 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65  iteral if it doe
7890: 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63  sn't match any c
78a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e  olumn names.  In
78b0: 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c   that.  ** case,
78c0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75   we need to retu
78d0: 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e  rn right away an
78e0: 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63  d not make any c
78f0: 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70  hanges to.  ** p
7900: 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Expr..  **.  ** 
7910: 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72  Because no refer
7920: 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f  ence was made to
7930: 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c   outer contexts,
7940: 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20   the pNC->nRef. 
7950: 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e   ** fields are n
7960: 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e  ot changed in an
7970: 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  y context..  */.
7980: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
7990: 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75  zTab==0 && pColu
79a0: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27  mnToken->z[0]=='
79b0: 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  "' ){.    sqlite
79c0: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  Free(zCol);.    
79d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
79e0: 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20   /*.  ** cnt==0 
79f0: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20  means there was 
7a00: 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e  not match.  cnt>
7a10: 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65  1 means there we
7a20: 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d  re two or.  ** m
7a30: 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69  ore matches.  Ei
7a40: 74 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76  ther way, we hav
7a50: 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f  e an error..  */
7a60: 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b  .  if( cnt!=1 ){
7a70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30  .    char *z = 0
7a80: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
7a90: 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74  ;.    zErr = cnt
7aa0: 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63  ==0 ? "no such c
7ab0: 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d  olumn: %s" : "am
7ac0: 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e  biguous column n
7ad0: 61 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66  ame: %s";.    if
7ae0: 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ( zDb ){.      s
7af0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
7b00: 26 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54  &z, zDb, ".", zT
7b10: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
7b20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
7b30: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73   zTab ){.      s
7b40: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
7b50: 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  &z, zTab, ".", z
7b60: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Col, 0);.    }el
7b70: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
7b80: 6c 69 74 65 53 74 72 44 75 70 28 7a 43 6f 6c 29  liteStrDup(zCol)
7b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7ba0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7bb0: 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20  se, zErr, z);.  
7bc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
7bd0: 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72  .    pTopNC->nEr
7be0: 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  r++;.  }..  /* I
7bf0: 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  f a column from 
7c00: 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c  a table in pSrcL
7c10: 69 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65  ist is reference
7c20: 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20  d, then record. 
7c30: 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e   ** this fact in
7c40: 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b   the pSrcList.a[
7c50: 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73  ].colUsed bitmas
7c60: 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75  k.  Column 0 cau
7c70: 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74  ses.  ** bit 0 t
7c80: 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d  o be set.  Colum
7c90: 6e 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20  n 1 sets bit 1. 
7ca0: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
7cb0: 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75  If the.  ** colu
7cc0: 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  mn number is gre
7cd0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75  ater than the nu
7ce0: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
7cf0: 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
7d00: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69   then set the hi
7d10: 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20  gh-order bit of 
7d20: 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a  the bitmask..  *
7d30: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69  /.  if( pExpr->i
7d40: 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61  Column>=0 && pMa
7d50: 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  tch!=0 ){.    in
7d60: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  t n = pExpr->iCo
7d70: 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e  lumn;.    if( n>
7d80: 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  =sizeof(Bitmask)
7d90: 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  *8 ){.      n = 
7da0: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
7db0: 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  8-1;.    }.    a
7dc0: 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69  ssert( pMatch->i
7dd0: 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69  Cursor==pExpr->i
7de0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61  Table );.    pMa
7df0: 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20  tch->colUsed |= 
7e00: 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75  1<<n;.  }..looku
7e10: 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20  pname_end:.  /* 
7e20: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
7e30: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
7e40: 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71  eFree(zDb);.  sq
7e50: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
7e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7e70: 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ete(pExpr->pLeft
7e80: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  );.  pExpr->pLef
7e90: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
7ea0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
7eb0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
7ec0: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a  pr->pRight = 0;.
7ed0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
7ee0: 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e  _COLUMN;.lookupn
7ef0: 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c  ame_end_2:.  sql
7f00: 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  iteFree(zCol);. 
7f10: 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20   if( cnt==1 ){. 
7f20: 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d     assert( pNC!=
7f30: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
7f40: 41 75 74 68 52 65 61 64 28 70 50 61 72 73 65 2c  AuthRead(pParse,
7f50: 20 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72   pExpr, pNC->pSr
7f60: 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  cList);.    if( 
7f70: 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63  pMatch && !pMatc
7f80: 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  h->pSelect ){.  
7f90: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
7fa0: 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a  = pMatch->pTab;.
7fb0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63      }.    /* Inc
7fc0: 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20  rement the nRef 
7fd0: 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d  value on all nam
7fe0: 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20  e contexts from 
7ff0: 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20  TopNC up to.    
8000: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65  ** the point whe
8010: 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63  re the name matc
8020: 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hed. */.    for(
8030: 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ;;){.      asser
8040: 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a  t( pTopNC!=0 );.
8050: 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52        pTopNC->nR
8060: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ef++;.      if( 
8070: 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72  pTopNC==pNC ) br
8080: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  eak;.      pTopN
8090: 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78  C = pTopNC->pNex
80a0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
80b0: 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 0;.  } else 
80c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
80d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
80e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
80f0: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
8100: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
8110: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  ee()..**.** Reso
8120: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
8130: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
8140: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
8150: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
8160: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
8170: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
8180: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
8190: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
81a0: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
81b0: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
81c0: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
81d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
81e0: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
81f0: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
8200: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
8210: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
8220: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
8230: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
8240: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
8250: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
8260: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
8270: 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f  tic int nameReso
8280: 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70  lverStep(void *p
8290: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
82a0: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
82b0: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
82c0: 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 53 72  text*)pArg;.  Sr
82d0: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 3b  cList *pSrcList;
82e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
82f0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
8300: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
8310: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
8320: 3b 0a 20 20 70 53 72 63 4c 69 73 74 20 3d 20 70  ;.  pSrcList = p
8330: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
8340: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
8350: 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70  arse;..  if( Exp
8360: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
8370: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
8380: 65 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ed) ) return 1;.
8390: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
83a0: 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f  y(pExpr, EP_Reso
83b0: 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e  lved);.#ifndef N
83c0: 44 45 42 55 47 0a 20 20 69 66 28 20 70 53 72 63  DEBUG.  if( pSrc
83d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  List ){.    int 
83e0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
83f0: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
8400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
8410: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
8420: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
8430: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
8440: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
8450: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
8460: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
8470: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8480: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
8490: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
84a0: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
84b0: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
84c0: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
84d0: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
84e0: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
84f0: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
8500: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
8510: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
8520: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
8530: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
8540: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
8550: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
8560: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
8570: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
8580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
8590: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
85a0: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
85b0: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
85c0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
85d0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
85e0: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
85f0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
8600: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
8610: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
8620: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
8630: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
8640: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
8650: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
8660: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
8670: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
8680: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
8690: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
86a0: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
86b0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
86c0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
86d0: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
86e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
86f0: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
8700: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
8710: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
8720: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
8730: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
8740: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
8750: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
8760: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
8770: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
8780: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
8790: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
87a0: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
87b0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
87c0: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
87d0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
87e0: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
87f0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
8800: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
8820: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
8830: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
8840: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
8850: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8860: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
8870: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
8880: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
8890: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
88a0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
88b0: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
88c0: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
88d0: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
88e0: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
88f0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8900: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
8910: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
8920: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
8930: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
8940: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
8950: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
8960: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8970: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
8980: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
8990: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
89a0: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
89b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
89c0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
89d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
89e0: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
89f0: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
8a00: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
8a10: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
8a20: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
8a30: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
8a40: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8a50: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
8a60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8a70: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
8a80: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8a90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
8aa0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
8ab0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
8ac0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
8ad0: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
8ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8af0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
8b00: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
8b10: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
8b20: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
8b30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
8b40: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
8b50: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
8b60: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
8b70: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
8b80: 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69  about the functi
8b90: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
8ba0: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
8bb0: 2d 3e 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64  ->enc;  /* The d
8bc0: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
8bd0: 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d   */..      zId =
8be0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b   pExpr->token.z;
8bf0: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
8c00: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
8c10: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
8c20: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
8c30: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
8c40: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
8c50: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
8c60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
8c70: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
8c80: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
8c90: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
8ca0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
8cb0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
8cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
8cd0: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
8ce0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8cf0: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
8d00: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
8d10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8d20: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
8d30: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
8d40: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
8d50: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
8d60: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
8d70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8d90: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
8da0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
8db0: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
8dc0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
8dd0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
8de0: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
8df0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
8e00: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
8e10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8e20: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
8e30: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
8e40: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
8e50: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
8e60: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
8e70: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
8e80: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
8e90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8ea0: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
8eb0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8ec0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
8ed0: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
8ee0: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
8ef0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
8f00: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
8f10: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
8f20: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
8f30: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
8f40: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
8f50: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
8f60: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
8f70: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
8f80: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
8f90: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
8fa0: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
8fb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
8fc0: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
8fd0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
8fe0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
8ff0: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
9000: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
9010: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
9020: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
9030: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
9040: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
9050: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
9060: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
9070: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
9080: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
9090: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
90a0: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
90b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
90c0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
90d0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
90e0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
90f0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
9100: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
9110: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
9120: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
9130: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
9140: 52 65 66 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Ref;.        sql
9150: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
9160: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9170: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
9180: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9190: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
91a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
91b0: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
91c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
91d0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
91e0: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
91f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9200: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9210: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9220: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9230: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
9240: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
9250: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
9260: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
9270: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
9280: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
9290: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
92a0: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
92b0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
92c0: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
92d0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
92e0: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
92f0: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
9300: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
9310: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
9320: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
9330: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
9340: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
9350: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
9360: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
9370: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
9380: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
9390: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
93a0: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
93b0: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
93c0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
93d0: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
93e0: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
93f0: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
9400: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
9410: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
9420: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
9430: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
9440: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
9450: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
9460: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
9470: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
9480: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
9490: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
94a0: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
94b0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
94c0: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
94d0: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
94e0: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
94f0: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
9500: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
9510: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
9520: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
9530: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
9540: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
9550: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
9560: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
9570: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
9580: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
9590: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
95a0: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
95b0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
95c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
95d0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
95e0: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
95f0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
9600: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9610: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
9620: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
9630: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
9640: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
9650: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
9660: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
9670: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
9680: 6c 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65  lveNames(.  Name
9690: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
96a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
96b0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
96c0: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
96d0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
96e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
96f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
9700: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
9710: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
9720: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 61  ) return 0;.  wa
9730: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
9740: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
9750: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28 20  ep, pNC);.  if( 
9760: 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  pNC->nErr>0 ){. 
9770: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9780: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
9790: 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  or);.  }.  retur
97a0: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
97b0: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
97c0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  r);.}../*.** A p
97d0: 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20  ointer instance 
97e0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
97f0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73  e is used to pas
9800: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
9810: 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70   through walkExp
9820: 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53  rTree into codeS
9830: 75 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a  ubqueryStep()..*
9840: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
9850: 20 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72   QueryCoder Quer
9860: 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51  yCoder;.struct Q
9870: 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61  ueryCoder {.  Pa
9880: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
9890: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
98a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e  g context */.  N
98b0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b  ameContext *pNC;
98c0: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
98d0: 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73   of first enclos
98e0: 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a  ing query */.};.
98f0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9900: 20 63 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65   code for subque
9910: 72 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72  ries and IN oper
9920: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20  ators..**.** IN 
9930: 6f 70 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20  operators comes 
9940: 69 6e 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  in two forms:.**
9950: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
9960: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
9970: 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  .** and.**      
9980: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
9990: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
99a0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
99b0: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65  s handled by cre
99c0: 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64  ating a set hold
99d0: 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20  ing the list.** 
99e0: 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  of allowed value
99f0: 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  s.  The second f
9a00: 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53  orm causes the S
9a10: 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74  ELECT to generat
9a20: 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  e .** a temporar
9a30: 79 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  y table..*/.#ifn
9a40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9a50: 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71  SUBQUERY.void sq
9a60: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
9a70: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
9a80: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9a90: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
9aa0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
9ac0: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
9ad0: 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ss */.  Vdbe *v 
9ae0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
9af0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
9b00: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
9b10: 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
9b20: 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
9b30: 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
9b40: 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
9b50: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
9b60: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
9b70: 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
9b80: 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
9b90: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
9ba0: 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
9bb0: 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
9bc0: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
9bd0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
9be0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
9bf0: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
9c00: 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
9c10: 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
9c20: 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
9c30: 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
9c40: 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
9c50: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
9c60: 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
9c70: 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
9c80: 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
9c90: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
9ca0: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
9cb0: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
9cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
9cd0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
9ce0: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
9cf0: 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d  ect) && !pParse-
9d00: 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
9d10: 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72    int mem = pPar
9d20: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
9d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9d40: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
9d50: 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  mem, 0);.    tes
9d60: 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
9d70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9d80: 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73  f, 0, 0);.    as
9d90: 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30  sert( testAddr>0
9da0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9dc0: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20  nteger, 1, 0);. 
9dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9de0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
9df0: 72 65 2c 20 6d 65 6d 2c 20 31 29 3b 0a 20 20 7d  re, mem, 1);.  }
9e00: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ..  if( pExpr->p
9e10: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
9e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9e30: 2c 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50  , OP_AggContextP
9e40: 75 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ush, 0, 0);.  }.
9e50: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9e60: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
9e70: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
9e80: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
9e90: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
9ea0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
9eb0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
9ec0: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
9ed0: 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75  enVirtual instru
9ee0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
9ef0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9f00: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
9f10: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
9f20: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
9f30: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
9f40: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
9f50: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
9f60: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
9f70: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
9f80: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
9f90: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
9fa0: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
9fb0: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
9fc0: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
9fd0: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
9fe0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
9ff0: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
a000: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
a010: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
a020: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
a030: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
a040: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
a050: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
a060: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
a070: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
a080: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
a090: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
a0a0: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
a0b0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
a0c0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
a0d0: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
a0e0: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
a0f0: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
a100: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
a110: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
a120: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a130: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
a140: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
a150: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
a160: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
a170: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
a180: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
a190: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
a1a0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
a1b0: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
a1c0: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
a1d0: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
a1e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
a1f0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
a200: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a210: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a220: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a230: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 45  _OpenVirtual, pE
a240: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
a250: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
a260: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
a270: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
a280: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
a290: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
a2a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a2b0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
a2c0: 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
a2d0: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
a2e0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
a2f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
a300: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
a310: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
a320: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
a330: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
a340: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
a350: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
a360: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
a370: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
a380: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
a390: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
a3a0: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
a3b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61  .        int iPa
a3c0: 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  rm = pExpr->iTab
a3d0: 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66  le +  (((int)aff
a3e0: 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20  inity)<<16);.   
a3f0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
a400: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
a410: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
a420: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
a430: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
a440: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
a450: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
a460: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
a470: 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d  , SRT_Set, iParm
a480: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
a490: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
a4a0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
a4b0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
a4c0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
a4d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
a4e0: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
a4f0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62  nfo.aColl[0] = b
a500: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
a510: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
a520: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
a530: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
a540: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
a550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a560: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
a570: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
a580: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
a590: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
a5a0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20  .        **..** 
a5b0: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
a5c0: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
a5d0: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
a5e0: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
a5f0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
a600: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
a610: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
a620: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
a630: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
a640: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
a650: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
a660: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
a670: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
a680: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
a690: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
a6a0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a6b0: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
a6c0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a6d0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
a6e0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
a6f0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
a700: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a710: 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20 20 20  m *pItem;..     
a720: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
a730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
a740: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
a750: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
a760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b       }.        k
a770: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
a780: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
a790: 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20  pColl;..        
a7a0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
a7b0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
a7c0: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
a7d0: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
a7e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
a7f0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
a800: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
a810: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
a820: 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
a830: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
a840: 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
a850: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
a860: 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
a870: 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
a880: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
a890: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
a8a0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
a8b0: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
a8c0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
a8d0: 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
a8e0: 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
a8f0: 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
a900: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
a910: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
a920: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
a930: 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
a940: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
a950: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
a960: 28 20 74 65 73 74 41 64 64 72 3e 30 20 26 26 20  ( testAddr>0 && 
a970: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
a980: 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
a990: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 4f             VdbeO
a9a0: 70 20 2a 61 4f 70 20 3d 20 73 71 6c 69 74 65 33  p *aOp = sqlite3
a9b0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 74 65 73  VdbeGetOp(v, tes
a9c0: 74 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20 20  tAddr-1);.      
a9d0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a9e0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
a9f0: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
aa00: 20 20 20 20 20 20 20 20 20 20 20 61 4f 70 5b 69             aOp[i
aa10: 5d 2e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ].opcode = OP_No
aa20: 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  op;.            
aa30: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  }.            te
aa40: 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  stAddr = 0;.    
aa50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
aa60: 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
aa70: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
aa80: 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
aa90: 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
aaa0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
aab0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
aac0: 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20  rse, pE2);.     
aad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aae0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
aaf0: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
ab00: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
ab10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ab20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
ab30: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
ab40: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
ab50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ab60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ab70: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
ab80: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
ab90: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
aba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
abb0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
abc0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
abd0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
abe0: 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f    /* This has to
abf0: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
ac00: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
ac10: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
ac20: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
ac30: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
ac40: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
ac50: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
ac60: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
ac70: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
ac80: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
ac90: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73    */.      int s
aca0: 6f 70 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  op;.      Select
acb0: 20 2a 70 53 65 6c 3b 0a 0a 20 20 20 20 20 20 70   *pSel;..      p
acc0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
acd0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
ace0: 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
acf0: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
ad00: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
ad10: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
ad20: 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54         sop = SRT
ad30: 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Mem;.      }els
ad40: 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  e{.        stati
ad50: 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e  c const Token on
ad60: 65 20 3d 20 7b 20 22 31 22 2c 20 30 2c 20 31 20  e = { "1", 0, 1 
ad70: 7d 3b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d  };.        sop =
ad80: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
ad90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ada0: 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d  ListDelete(pSel-
adb0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
adc0: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
add0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ade0: 41 70 70 65 6e 64 28 30 2c 20 0a 20 20 20 20 20  Append(0, .     
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ae10: 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20  (TK_INTEGER, 0, 
ae20: 30 2c 20 26 6f 6e 65 29 2c 20 30 29 3b 0a 20 20  0, &one), 0);.  
ae30: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ae40: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
ae50: 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 70 45 78  , pSel, sop, pEx
ae60: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 20  pr->iColumn, 0, 
ae70: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
ae80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
ae90: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ..  if( pExpr->p
aea0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
aeb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
aec0: 2c 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50  , OP_AggContextP
aed0: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  op, 0, 0);.  }. 
aee0: 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b   if( testAddr ){
aef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
af00: 43 68 61 6e 67 65 50 32 28 76 2c 20 74 65 73 74  ChangeP2(v, test
af10: 41 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62  Addr, sqlite3Vdb
af20: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
af30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
af40: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
af50: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
af60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
af70: 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
af80: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
af90: 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
afa0: 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
afb0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68   z[0..n-1] on th
afc0: 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e stack..*/.stat
afd0: 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
afe0: 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  ger(Vdbe *v, con
aff0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
b000: 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
b010: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
b020: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
b030: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b040: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
b050: 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   i, 0);.  }else 
b060: 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
b070: 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20  n64Bits(z) ){.  
b080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
b090: 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
b0a0: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c   0, z, n);.  }el
b0b0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
b0c0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  dbeOp3(v, OP_Rea
b0d0: 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  l, 0, 0, z, n);.
b0e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
b0f0: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
b100: 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
b110: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
b120: 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
b130: 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74  sion and leave t
b140: 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65  he result on the
b150: 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a   top of stack..*
b160: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
b170: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
b180: 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
b190: 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
b1a0: 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
b1b0: 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
b1c0: 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
b1d0: 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
b1e0: 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
b1f0: 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
b200: 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
b210: 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
b220: 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
b230: 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
b240: 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
b250: 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
b260: 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
b270: 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
b280: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
b290: 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
b2a0: 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
b2b0: 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
b2c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b2d0: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
b2e0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
b2f0: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
b300: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b310: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28  .  int op;.  if(
b320: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
b330: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
b340: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
b360: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65  l, 0, 0);.    re
b370: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d  turn;.  }.  op =
b380: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
b390: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
b3a0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
b3b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
b3c0: 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20 26 26 20  rse->fillAgg && 
b3d0: 70 45 78 70 72 2d 3e 69 41 67 67 3e 3d 30 20 29  pExpr->iAgg>=0 )
b3e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b3f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b400: 5f 41 67 67 47 65 74 2c 20 70 45 78 70 72 2d 3e  _AggGet, pExpr->
b410: 69 41 67 67 43 74 78 2c 20 70 45 78 70 72 2d 3e  iAggCtx, pExpr->
b420: 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iAgg);.      }el
b430: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  se if( pExpr->iC
b440: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
b450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b460: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
b470: 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
b480: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
b490: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b4a0: 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
b4b0: 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  v, pExpr->pTab, 
b4c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
b4d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b4f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
b500: 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  id, pExpr->iTabl
b510: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
b520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b530: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
b540: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
b550: 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45  odeInteger(v, pE
b560: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
b570: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
b580: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b590: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
b5a0: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
b5b0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
b5c0: 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41   assert( TK_FLOA
b5d0: 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20  T==OP_Real );.  
b5e0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
b5f0: 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67  TRING==OP_String
b600: 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 );.      sqlit
b610: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c  e3VdbeOp3(v, op,
b620: 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f   0, 0, pExpr->to
b630: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
b640: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71  ken.n);.      sq
b650: 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65  lite3VdbeDequote
b660: 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20  P3(v, -1);.     
b670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b680: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
b690: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b6a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
b6b0: 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
b6c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b6d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6e0: 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
b6f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
b700: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b710: 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65  ( TK_BLOB==OP_He
b720: 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 73  xBlob );.      s
b730: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
b740: 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78 70 72   op, 0, 0, pExpr
b750: 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70 45 78  ->token.z+1, pEx
b760: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29 3b 0a  pr->token.n-1);.
b770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b780: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31  eDequoteP3(v, -1
b790: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b7a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b7b0: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
b7c0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
b7d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b7e0: 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
b7f0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
b800: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
b810: 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20  token.n>1 ){.   
b820: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b830: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
b840: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
b850: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
b860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
b870: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b880: 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
b890: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b8a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b8b0: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d  _MemLoad, pExpr-
b8c0: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
b8d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b8e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b8f0: 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
b900: 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
b910: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
b920: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
b930: 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
b940: 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69  oken) */.      i
b950: 6e 74 20 61 66 66 2c 20 6f 70 3b 0a 20 20 20 20  nt aff, op;.    
b960: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b970: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b980: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
b990: 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ff = sqlite3Affi
b9a0: 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72 2d  nityType(&pExpr-
b9b0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
b9c0: 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20  witch( aff ){.  
b9d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b9e0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 20  E_AFF_INTEGER:  
b9f0: 20 6f 70 20 3d 20 4f 50 5f 54 6f 49 6e 74 3b 20   op = OP_ToInt; 
ba00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ba10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ba20: 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 20 20 6f  AFF_NUMERIC:   o
ba30: 70 20 3d 20 4f 50 5f 54 6f 4e 75 6d 65 72 69 63  p = OP_ToNumeric
ba40: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
ba50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
ba60: 46 5f 54 45 58 54 3a 20 20 20 20 20 20 6f 70 20  F_TEXT:      op 
ba70: 3d 20 4f 50 5f 54 6f 54 65 78 74 3b 20 20 20 20  = OP_ToText;    
ba80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ba90: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
baa0: 4e 4f 4e 45 3a 20 20 20 20 20 20 6f 70 20 3d 20  NONE:      op = 
bab0: 4f 50 5f 54 6f 42 6c 6f 62 3b 20 20 20 20 20 62  OP_ToBlob;     b
bac0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
bad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bae0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
baf0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
bb00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
bb10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
bb20: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
bb30: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
bb40: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
bb50: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
bb60: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
bb70: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
bb80: 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  EQ: {.      asse
bb90: 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74  rt( TK_LT==OP_Lt
bba0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bbb0: 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29  ( TK_LE==OP_Le )
bbc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bbd0: 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a  TK_GT==OP_Gt );.
bbe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
bbf0: 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20  _GE==OP_Ge );.  
bc00: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45      assert( TK_E
bc10: 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  Q==OP_Eq );.    
bc20: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d    assert( TK_NE=
bc30: 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Ne );.      
bc40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
bc50: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
bc60: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
bc70: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
bc80: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
bc90: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
bca0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
bcb0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
bcc0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20  pr->pRight, op, 
bcd0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
bce0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
bcf0: 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
bd00: 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
bd10: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
bd20: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
bd30: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
bd40: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
bd50: 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
bd60: 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
bd70: 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
bd80: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20  se TK_SLASH:.   
bd90: 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a   case TK_LSHIFT:
bda0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
bdb0: 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54  IFT: .    case T
bdc0: 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
bdd0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44    assert( TK_AND
bde0: 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20  ==OP_And );.    
bdf0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
be00: 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20  =OP_Or );.      
be10: 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
be20: 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20  =OP_Add );.     
be30: 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
be40: 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
be50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
be60: 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
be70: 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73  nder );.      as
be80: 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
be90: 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20  =OP_BitAnd );.  
bea0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
beb0: 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
bec0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bed0: 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
bee0: 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ide );.      ass
bef0: 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
bf00: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a  OP_ShiftLeft );.
bf10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
bf20: 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
bf30: 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  tRight );.      
bf40: 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
bf50: 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a  T==OP_Concat );.
bf60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bf70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
bf80: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
bf90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
bfa0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
bfb0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
bfc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bfd0: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
bfe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bff0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
c000: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
c010: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
c020: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
c030: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
c040: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
c050: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
c060: 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
c070: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
c080: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
c090: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
c0a0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
c0b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
c0c0: 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20  >n + 2 );.      
c0d0: 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25    sprintf(z, "-%
c0e0: 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a  .*s", p->n, p->z
c0f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
c100: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
c110: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
c120: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
c130: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c  , OP_Real, 0, 0,
c140: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
c150: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c160: 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
c170: 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b  r(v, z, p->n+1);
c180: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c190: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
c1a0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
c1c0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
c1d0: 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20  nto TK_NOT */.  
c1e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c1f0: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
c200: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
c210: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
c220: 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
c230: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c240: 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
c250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c260: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c270: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
c280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c290: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
c2a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c2b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c2c0: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
c2d0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
c2e0: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
c2f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c300: 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e  K_ISNULL==OP_IsN
c310: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ull );.      ass
c320: 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
c330: 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20  =OP_NotNull );. 
c340: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c350: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
c360: 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ger, 1, 0);.    
c370: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c380: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c390: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64  >pLeft);.      d
c3a0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
c3b0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
c3c0: 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 2;.      sqlit
c3d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
c3e0: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
c3f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c400: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
c410: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , -1, 0);.      
c420: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c430: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
c440: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73  CTION: {.      s
c450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c460: 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c  v, OP_AggGet, 0,
c470: 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20   pExpr->iAgg);. 
c480: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c490: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
c4a0: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
c4b0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
c4c0: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
c4d0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
c4e0: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  >pList;.      in
c4f0: 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20  t nExpr = pList 
c500: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
c510: 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   0;.      FuncDe
c520: 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
c530: 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f  nt nId;.      co
c540: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20  nst char *zId;. 
c550: 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 30 3b       int p2 = 0;
c560: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
c570: 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61      u8 enc = pPa
c580: 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20  rse->db->enc;.  
c590: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
c5a0: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 49  ll = 0;.      zI
c5b0: 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  d = pExpr->token
c5c0: 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20  .z;.      nId = 
c5d0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a  pExpr->token.n;.
c5e0: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
c5f0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
c600: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
c610: 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e  , nId, nExpr, en
c620: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  c, 0);.      ass
c630: 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a  ert( pDef!=0 );.
c640: 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71        nExpr = sq
c650: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
c660: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
c670: 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ist);.      for(
c680: 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20  i=0; i<nExpr && 
c690: 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<32; i++){.    
c6a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c6b0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c  xprIsConstant(pL
c6c0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
c6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 32   ){.          p2
c6e0: 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20   |= (1<<i);.    
c6f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
c700: 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c  ( pDef->needColl
c710: 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  Seq && !pColl ){
c720: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
c730: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
c740: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c  llSeq(pParse, pL
c750: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
c760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c770: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
c780: 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  ef->needCollSeq 
c790: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
c7a0: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
c7b0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
c7c0: 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
c7d0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
c7e0: 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
c7f0: 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
c800: 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P3_COLLSEQ);.
c810: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
c820: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
c830: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45 78  OP_Function, nEx
c840: 70 72 2c 20 70 32 2c 20 28 63 68 61 72 2a 29 70  pr, p2, (char*)p
c850: 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  Def, P3_FUNCDEF)
c860: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c870: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
c880: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
c890: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
c8a0: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
c8b0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
c8c0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62    sqlite3CodeSub
c8d0: 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  select(pParse, p
c8e0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
c8f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c900: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78   OP_MemLoad, pEx
c910: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b  pr->iColumn, 0);
c920: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
c930: 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73  nt((v, "# load s
c940: 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
c950: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c960: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c970: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
c980: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68  t addr;.      ch
c990: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
c9a0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
c9b0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
c9c0: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
c9d0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
c9e0: 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   affinity to use
c9f0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79   to create a key
ca00: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74   from the result
ca10: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
ca20: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66  e expression. af
ca30: 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73  finityStr stores
ca40: 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67   a static string
ca50: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20   suitable for.  
ca60: 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f      ** P3 of OP_
ca70: 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20  MakeRecord..    
ca80: 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e    */.      affin
ca90: 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  ity = comparison
caa0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
cab0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
cac0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
cad0: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 0a  nteger, 1, 0);..
cae0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
caf0: 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
cb00: 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
cb10: 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   The temporary t
cb20: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45  able.      ** pE
cb30: 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74  xpr->iTable cont
cb40: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
cb50: 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
cb60: 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20   (...) set..    
cb70: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
cb80: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
cb90: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
cba0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
cbb0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
cbc0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
cbd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cbe0: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
cbf0: 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20  -1, addr+4);    
cc00: 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20          /* addr 
cc10: 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 0 */.      sql
cc20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cc30: 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a   OP_Pop, 2, 0);.
cc40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cc50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
cc60: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
cc70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc80: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
cc90: 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73  addr+7);.      s
cca0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
ccb0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
ccc0: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
ccd0: 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b   1);   /* addr +
cce0: 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69   4 */.      sqli
ccf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cd00: 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  OP_Found, pExpr-
cd10: 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29  >iTable, addr+7)
cd20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cd30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
cd40: 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20  ddImm, -1, 0);  
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a  /* addr + 6 */..
cd70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cd80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
cd90: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
cda0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
cdb0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
cdc0: 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
cdd0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
cde0: 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70  LItem = pExpr->p
cdf0: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45  List->a;.      E
ce00: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c  xpr *pRight = pL
ce10: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
ce20: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ce30: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
ce40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ce50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ce60: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
ce70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ce80: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
ce90: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
cea0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
ceb0: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
cec0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
ced0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cee0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
cef0: 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  0);.      pLItem
cf00: 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
cf10: 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
cf20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
cf30: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
cf40: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
cf50: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
cf60: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
cf70: 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Le, 0, 0);.
cf80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64  eAddOp(v, OP_And
cfa0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
cfb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cfc0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20  case TK_UPLUS:. 
cfd0: 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
cfe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
cff0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d000: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
d010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d020: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
d030: 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  E: {.      int e
d040: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20  xpr_end_label;. 
d050: 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73       int jumpIns
d060: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
d070: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  r;.      int nEx
d080: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  pr;.      int i;
d090: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
d0a0: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  *pEList;.      s
d0b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
d0c0: 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a  tem *aListelem;.
d0d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
d0e0: 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
d0f0: 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
d100: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  ->pList->nExpr %
d110: 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
d120: 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
d130: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
d140: 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
d150: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
d160: 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
d170: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
d180: 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
d190: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
d1a0: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20  xpr_end_label = 
d1b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d1c0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
d1d0: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
d1e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d1f0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d200: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
d210: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d220: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
d230: 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
d240: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d250: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
d260: 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  lem[i].pExpr);. 
d270: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
d280: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
d290: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d2a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
d2b0: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   1, 1);.        
d2c0: 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64    jumpInst = cod
d2d0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
d2e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61   pExpr->pLeft, a
d2f0: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
d300: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29      OP_Ne, 0, 1)
d330: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d340: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d350: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
d360: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d370: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
d380: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d390: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
d3a0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
d3b0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
d3c0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d3d0: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
d3e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
d3f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d400: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
d410: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
d420: 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
d430: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d440: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
d460: 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70 49  hangeP2(v, jumpI
d470: 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  nst, addr);.    
d480: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
d490: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
d4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d4b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
d4c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
d4d0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
d4e0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
d4f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d500: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
d510: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
d520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d540: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
d550: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
d560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d570: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
d580: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
d590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d5a0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
d5b0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
d5c0: 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
d5d0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
d5e0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
d5f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d600: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d610: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
d620: 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
d630: 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
d640: 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
d650: 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
d660: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d  .return;.      }
d670: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
d680: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
d690: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
d6a0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
d6b0: 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
d6c0: 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
d6d0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
d6e0: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
d6f0: 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
d700: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
d710: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
d720: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
d730: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
d740: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
d750: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
d760: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
d790: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
d7a0: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  .n);.         sq
d7b0: 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65  lite3VdbeDequote
d7c0: 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20  P3(v, -1);.     
d7d0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
d7e0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
d7f0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
d800: 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20  Ignore );.      
d810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d820: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78  dOp(v, OP_Contex
d830: 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tPop, 0, 0);.   
d840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
d860: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
d870: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
d880: 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56  ump);.         V
d890: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
d8a0: 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22  # raise(IGNORE)"
d8b0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
d8c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
d8d0: 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  ak;.  }.}..#ifnd
d8e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
d8f0: 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e  RIGGER./*.** Gen
d900: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
d910: 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
d920: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
d930: 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65 73  d leaves the res
d940: 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  ult.** on the st
d950: 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73  ack.  See also s
d960: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
d970: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
d980: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
d990: 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c 74  cache the result
d9a0: 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
d9b0: 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f  pExpr tree.** so
d9c0: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61   that it will ma
d9d0: 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63 61  ke use of the ca
d9e0: 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73  ched result on s
d9f0: 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61  ubsequent evalua
da00: 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20  tions.** rather 
da10: 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68  than evaluate th
da20: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
da30: 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69  on again.  Trivi
da40: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  al expressions a
da50: 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64  re.** not cached
da60: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
da70: 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20  sion is cached, 
da80: 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73 74  its result is st
da90: 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65  ored in a .** me
daa0: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  mory location..*
dab0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
dac0: 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
dad0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
dae0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
daf0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
db00: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
db10: 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  m;.  int addr1, 
db20: 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d  addr2;.  if( v==
db30: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64  0 ) return;.  ad
db40: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
db50: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
db60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
db70: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
db80: 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c  );.  addr2 = sql
db90: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
dba0: 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64  ddr(v);.  if( ad
dbb0: 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73  dr2>addr1+1 || s
dbc0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
dbd0: 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64  v, addr1)->opcod
dbe0: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29  e==OP_Function )
dbf0: 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78  {.    iMem = pEx
dc00: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
dc10: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
dc20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc30: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
dc40: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
dc50: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
dc60: 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23  EGISTER;.  }.}.#
dc70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
dc80: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
dc90: 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
dca0: 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
dcb0: 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
dcc0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
dcd0: 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  t onto the stack
dce0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
dcf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
dd00: 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74  ments pushed ont
dd10: 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  o the stack..*/.
dd20: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
dd30: 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
dd40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dd50: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
dd60: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
dd70: 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20  st *pList    /* 
dd80: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
dd90: 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
dda0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
ddb0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
ddc0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
ddd0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66  .  Vdbe *v;.  if
dde0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
ddf0: 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20 73 71 6c  urn 0;.  v = sql
de00: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
de10: 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74  se);.  n = pList
de20: 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
de30: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
de40: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
de50: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
de60: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
de70: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
de80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
de90: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
dea0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
deb0: 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
dec0: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
ded0: 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
dee0: 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
def0: 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
df00: 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
df10: 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
df20: 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
df30: 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
df40: 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
df50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
df60: 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
df70: 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
df80: 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
df90: 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
dfa0: 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
dfb0: 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
dfc0: 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
dfd0: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
dfe0: 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
dff0: 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
e000: 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
e010: 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
e020: 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
e030: 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
e040: 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
e050: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
e060: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
e070: 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
e080: 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
e090: 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
e0a0: 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
e0b0: 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
e0c0: 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
e0d0: 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
e0e0: 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
e0f0: 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
e100: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
e110: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
e120: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
e130: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e140: 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
e150: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
e160: 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
e170: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
e180: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
e190: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
e1a0: 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d  op = 0;.  if( v=
e1b0: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
e1c0: 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20   return;.  op = 
e1d0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
e1e0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
e1f0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
e200: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
e210: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
e220: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
e230: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
e240: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e250: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
e260: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
e270: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
e280: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
e290: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
e2a0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
e2b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e2c0: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
e2d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e2e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
e2f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e300: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
e310: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e320: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
e330: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
e340: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
e350: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
e360: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
e370: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
e380: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e390: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
e3a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
e3b0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
e3c0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
e3d0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
e3e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e3f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
e400: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
e410: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
e420: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
e430: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
e440: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
e450: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
e460: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
e470: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e480: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
e490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e4a0: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
e4b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
e4c0: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
e4d0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
e4e0: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
e4f0: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
e500: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
e510: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e520: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
e530: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
e540: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e550: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
e560: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
e570: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
e580: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
e590: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65  ->pRight, op, de
e5a0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
e5b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e5c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e5d0: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
e5e0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
e5f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e600: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
e610: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
e620: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
e630: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
e640: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e650: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
e660: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
e670: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e680: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
e690: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e6a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e6b0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
e6c0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e6d0: 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ion "x BETWEEN y
e6e0: 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65   AND z" is imple
e6f0: 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
e700: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
e710: 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33  F (x < y) GOTO 3
e720: 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28  .      ** 2 IF (
e730: 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65  x <= z) GOTO <de
e740: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e  st>.      ** 3 .
e750: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
e760: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
e770: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
e780: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
e790: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
e7a0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
e7b0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
e7c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e7d0: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
e7e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e7f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e800: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
e810: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e820: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
e830: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
e840: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
e850: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
e860: 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75  t, OP_Lt, 0, !ju
e870: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
e880: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
e890: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
e8a0: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
e8b0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e8c0: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
e8d0: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
e8e0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
e8f0: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74  ght, OP_Le, dest
e900: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a  , jumpIfNull);..
e910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e920: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
e930: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
e940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e950: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
e960: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
e970: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
e980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e990: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
e9a0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
e9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
e9c0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
e9d0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e9e0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
e9f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ea00: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75  dOp(v, OP_If, ju
ea10: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
ea20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ea30: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ea40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
ea50: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
ea60: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
ea70: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
ea80: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
ea90: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
eaa0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
eab0: 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
eac0: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
ead0: 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
eae0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
eaf0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
eb00: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
eb10: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
eb20: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
eb30: 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
eb40: 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
eb50: 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20  Null is true or 
eb60: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
eb70: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61  jumpIfNull is fa
eb80: 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lse..*/.void sql
eb90: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
eba0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
ebb0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
ebc0: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
ebd0: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
ebe0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ebf0: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
ec00: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
ec10: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
ec20: 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
ec30: 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
ec40: 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
ec50: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
ec60: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
ec70: 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
ec80: 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
ec90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
eca0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
ecb0: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
ecc0: 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
ecd0: 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
ece0: 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
ecf0: 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
ed00: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
ed20: 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
ed30: 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
ed40: 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
ed50: 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
ed60: 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
ed70: 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
ed80: 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
ed90: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
edb0: 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
edc0: 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
edd0: 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
ede0: 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
edf0: 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
ee00: 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
ee10: 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
ee20: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
ee30: 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
ee40: 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
ee50: 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
ee60: 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
ee70: 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
ee80: 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
ee90: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
eea0: 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
eeb0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
eec0: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
eed0: 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
eee0: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
eef0: 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
ef00: 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
ef10: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
ef20: 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
ef30: 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
ef40: 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
ef50: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
ef60: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
ef70: 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
ef80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
ef90: 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
efa0: 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
efb0: 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
efc0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
efd0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
efe0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
eff0: 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
f000: 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
f010: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
f020: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
f030: 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
f040: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
f050: 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
f060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
f070: 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
f080: 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
f090: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f0a0: 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
f0b0: 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
f0c0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
f0d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
f0e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f0f0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
f100: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f110: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
f120: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
f130: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
f140: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
f150: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
f160: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
f170: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f180: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
f190: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
f1a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f1b0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
f1c0: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
f1d0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f1e0: 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75  t, d2, !jumpIfNu
f1f0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
f200: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
f210: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
f220: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
f230: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
f240: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f250: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
f260: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f270: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
f280: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f290: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
f2a0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f2b0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
f2c0: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
f2d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f2e0: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
f2f0: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
f300: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
f310: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
f320: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
f330: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
f340: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f350: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f360: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
f370: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f380: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
f390: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
f3a0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
f3b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
f3c0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20  pr->pRight, op, 
f3d0: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
f3e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f3f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f400: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
f410: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
f420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f430: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f440: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f460: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
f470: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
f480: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f490: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
f4a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
f4b0: 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45  ression is "x BE
f4c0: 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20  TWEEN y AND z". 
f4d0: 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  It is implemente
f4e0: 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
f4f0: 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20       ** 1 IF (x 
f500: 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20  >= y) GOTO 3.   
f510: 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65     ** 2 GOTO <de
f520: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49  st>.      ** 3 I
f530: 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c  F (x > z) GOTO <
f540: 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20  dest>.      */. 
f550: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
f560: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
f570: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
f580: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
f590: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
f5a0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
f5b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f5c0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
f5d0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
f5e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f5f0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
f600: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f610: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
f620: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  ght);.      addr
f630: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
f640: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
f650: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
f660: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
f670: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64  Right, OP_Ge, ad
f680: 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  dr+3, !jumpIfNul
f690: 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  l);..      sqlit
f6a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f6b0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
f6c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f6d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
f6e0: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
f6f0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
f700: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
f710: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
f720: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f730: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
f740: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
f750: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
f760: 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c  ht, OP_Gt, dest,
f770: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
f780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f790: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f7b0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f7c0: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
f7d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f7e0: 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66  OP_IfNot, jumpIf
f7f0: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
f800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20    }.}../*.** Do 
f820: 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
f830: 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
f840: 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
f850: 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
f860: 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
f870: 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
f880: 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
f890: 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
f8a0: 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ny way..*/.int s
f8b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
f8c0: 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
f8d0: 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
f8e0: 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20    if( pA==0 ){. 
f8f0: 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b     return pB==0;
f900: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d  .  }else if( pB=
f910: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
f920: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
f930: 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72  ->op!=pB->op ) r
f940: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
f950: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
f960: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
f970: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
f980: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
f990: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
f9a0: 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
f9b0: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
f9c0: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  0;.  if( pA->pLi
f9d0: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  st ){.    if( pB
f9e0: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ->pList==0 ) ret
f9f0: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
fa00: 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  A->pList->nExpr!
fa10: 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  =pB->pList->nExp
fa20: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
fa30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
fa40: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
fa50: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
fa60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
fa70: 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b  re(pA->pList->a[
fa80: 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c  i].pExpr, pB->pL
fa90: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
faa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fab0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
fac0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
fad0: 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pB->pList ){.   
fae0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
faf0: 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74   if( pA->pSelect
fb00: 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20   || pB->pSelect 
fb10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
fb20: 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
fb30: 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
fb40: 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
fb50: 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  lumn ) return 0;
fb60: 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e  .  if( pA->token
fb70: 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
fb80: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
fb90: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
fba0: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
fbb0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
fbc0: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
fbd0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 41  lite3StrNICmp(pA
fbe0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74  ->token.z, pB->t
fbf0: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
fc00: 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  n.n)!=0 ) return
fc10: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
fc20: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   1;.}../*.** Add
fc30: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
fc40: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
fc50: 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72  gg[] array and r
fc60: 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e  eturn its index.
fc70: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6c 65 6d  .** The new elem
fc80: 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ent is initializ
fc90: 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  ed to zero.  The
fca0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
fcb0: 6e 20 69 73 0a 2a 2a 20 65 78 70 65 63 74 65 64  n is.** expected
fcc0: 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
fcd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
fce0: 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73  pendAggInfo(Pars
fcf0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
fd00: 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  ( (pParse->nAgg 
fd10: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
fd20: 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73   int amt = pPars
fd30: 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20  e->nAgg + 8;.   
fd40: 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d   AggExpr *aAgg =
fd50: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
fd60: 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74  Parse->aAgg, amt
fd70: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
fd80: 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aAgg[0]));.    i
fd90: 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20  f( aAgg==0 ){.  
fda0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
fdb0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
fdc0: 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20  >aAgg = aAgg;.  
fdd0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72  }.  memset(&pPar
fde0: 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d  se->aAgg[pParse-
fdf0: 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nAgg], 0, sizeo
fe00: 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30  f(pParse->aAgg[0
fe10: 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ]));.  return pP
fe20: 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a  arse->nAgg++;.}.
fe30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
fe40: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
fe50: 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20  ExprTree() used 
fe60: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a  to implement .**
fe70: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
fe80: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
fe90: 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
fea0: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
feb0: 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
fec0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
fed0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
fee0: 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68  tine analyzes th
fef0: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
ff00: 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a  tion at pExpr..*
ff10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
ff20: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f  lyzeAggregate(vo
ff30: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
ff40: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
ff50: 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67  .  AggExpr *aAgg
ff60: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
ff70: 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74  *pNC = (NameCont
ff80: 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61  ext *)pArg;.  Pa
ff90: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
ffa0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
ffb0: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
ffc0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
ffd0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
ffe0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
fff0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
10000 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 53 72      for(i=0; pSr
10010 63 4c 69 73 74 20 26 26 20 69 3c 70 53 72 63 4c  cList && i<pSrcL
10020 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
10030 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
10040 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
10050 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
10060 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
10070 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
10080 41 67 67 3b 0a 20 20 20 20 20 20 20 20 20 20 66  Agg;.          f
10090 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
100a0 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
100b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 41            if( aA
100c0 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
100d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
100e0 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
100f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
10100 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
10110 20 20 20 20 20 20 20 20 20 20 26 26 20 61 41 67            && aAg
10120 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  g[i].pExpr->iCol
10130 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
10140 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
10150 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10180 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
10190 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Agg ){.         
101a0 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67     i = appendAgg
101b0 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20  Info(pParse);.  
101c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
101d0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
101e0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
101f0 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
10200 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
10210 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
10220 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
10230 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10240 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
10250 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  g = i;.         
10260 20 70 45 78 70 72 2d 3e 69 41 67 67 43 74 78 20   pExpr->iAggCtx 
10270 3d 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3b 0a 20  = pNC->nDepth;. 
10280 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10290 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
102a0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
102b0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
102c0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
102d0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
102e0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
102f0 29 7b 0a 20 20 20 20 20 20 20 20 61 41 67 67 20  ){.        aAgg 
10300 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a  = pParse->aAgg;.
10310 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
10320 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
10330 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
10340 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73   if( !aAgg[i].is
10350 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
10360 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
10370 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
10380 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20  (aAgg[i].pExpr, 
10390 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
103a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
103b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
103c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
103d0 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29  >=pParse->nAgg )
103e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
103f0 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
10400 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
10410 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
10420 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
10430 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72       if( i<0 ) r
10440 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
10450 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
10460 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  i].isAgg = 1;.  
10470 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
10480 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20  aAgg[i].pExpr = 
10490 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
104a0 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
104b0 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  .pFunc = sqlite3
104c0 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
104d0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
104e0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
104f0 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
10500 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20  oken.n,.        
10510 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
10520 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69  ist ? pExpr->pLi
10530 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
10540 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
10550 7d 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  }.        pExpr-
10560 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
10570 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
10580 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10590 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
105a0 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  ect ){.    pNC->
105b0 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61  nDepth++;.    wa
105c0 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45 78  lkSelectExpr(pEx
105d0 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61  pr->pSelect, ana
105e0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
105f0 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  NC);.    pNC->nD
10600 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  epth--;.  }.  re
10610 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10620 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
10630 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
10640 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
10650 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
10660 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
10670 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
10680 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
10690 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
106a0 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
106b0 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
106c0 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
106d0 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
106e0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
106f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
10700 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
10710 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
10720 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
10730 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
10740 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
10750 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  lveNames()..**.*
10760 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
10770 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
10780 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
10790 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
107a0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
107b0 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
107c0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
107d0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
107e0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
107f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
10800 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e 43    int nErr = pNC
10810 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  ->pParse->nErr;.
10820 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
10830 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67  Expr, analyzeAgg
10840 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
10850 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61 72  return pNC->pPar
10860 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b  se->nErr - nErr;
10870 0a 7d 0a                                         .}.