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

Artifact 43d49f124badc9b883cd7315c42a7564c9a59be9:


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 39 20 32 30 30 35 2f 30 38 2f 32 33 20  .219 2005/08/23 
0220: 31 31 3a 31 37 3a 35 39 20 64 72 68 20 45 78 70  11:17:59 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 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
1d10: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1d20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d30: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
1d40: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70  syntax error", p
1d50: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  Token);.    retu
1d60: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1d70: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) 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 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
2e80: 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64  Expr.token field
2e90: 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69   might be a stri
2ea0: 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ng literal that 
2eb0: 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66  is quoted..** If
2ec0: 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20   so, remove the 
2ed0: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e  quotation marks.
2ee0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2ef0: 44 65 71 75 6f 74 65 45 78 70 72 28 45 78 70 72  DequoteExpr(Expr
2f00: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
2f10: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
2f20: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29  , EP_Dequoted) )
2f30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
2f40: 7d 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  }.  ExprSetPrope
2f50: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
2f60: 65 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  ed);.  if( p->to
2f70: 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ken.dyn==0 ){.  
2f80: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
2f90: 70 79 28 26 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70  py(&p->token, &p
2fa0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20  ->token);.  }.  
2fb0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 28  sqlite3Dequote((
2fc0: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
2fd0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
2fe0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
2ff0: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
3000: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
3010: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
3020: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3030: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
3040: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
3050: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
3060: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
3070: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
3080: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
3090: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
30a0: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
30b0: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
30c0: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
30d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
30e0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
30f0: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
3100: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
3110: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
3120: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
3130: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
3140: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
3150: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
3160: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
3170: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
3180: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
3190: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
31a0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
31b0: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
31c0: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
31d0: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
31e0: 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70  plicated..*/.Exp
31f0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
3200: 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78  p(Expr *p){.  Ex
3210: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  pr *pNew;.  if( 
3220: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3230: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3240: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
3250: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
3260: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3270: 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  0;.  memcpy(pNew
3280: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , p, sizeof(*pNe
3290: 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  w));.  if( p->to
32a0: 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  ken.z!=0 ){.    
32b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  pNew->token.z = 
32c0: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 2d  sqliteStrNDup(p-
32d0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b  >token.z, p->tok
32e0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  en.n);.    pNew-
32f0: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a  >token.dyn = 1;.
3300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3310: 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  ert( pNew->token
3320: 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  .z==0 );.  }.  p
3330: 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b  New->span.z = 0;
3340: 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d  .  pNew->pLeft =
3350: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3360: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65  p->pLeft);.  pNe
3370: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
3380: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 52  te3ExprDup(p->pR
3390: 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ight);.  pNew->p
33a0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
33b0: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c 69  prListDup(p->pLi
33c0: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65  st);.  pNew->pSe
33d0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
33e0: 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c 65  lectDup(p->pSele
33f0: 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 54 61  ct);.  pNew->pTa
3400: 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20 72  b = p->pTab;.  r
3410: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f  eturn pNew;.}.vo
3420: 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43  id sqlite3TokenC
3430: 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  opy(Token *pTo, 
3440: 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20  Token *pFrom){. 
3450: 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20   if( pTo->dyn ) 
3460: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
3470: 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28  *)pTo->z);.  if(
3480: 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20   pFrom->z ){.   
3490: 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d   pTo->n = pFrom-
34a0: 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  >n;.    pTo->z =
34b0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
34c0: 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e  From->z, pFrom->
34d0: 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e  n);.    pTo->dyn
34e0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
34f0: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20     pTo->z = 0;. 
3500: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
3510: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3520: 70 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a  p(ExprList *p){.
3530: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
3540: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
3550: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
3560: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
3570: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3580: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3590: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
35a0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
35b0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
35c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
35d0: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e  pNew->nExpr = pN
35e0: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
35f0: 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61  nExpr;.  pNew->a
3600: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
3610: 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70  eMalloc( p->nExp
3620: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  r*sizeof(p->a[0]
3630: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
3640: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
3650: 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
3660: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
3670: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
3680: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
3690: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
36a0: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
36b0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
36c0: 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78  NewExpr, *pOldEx
36d0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
36e0: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
36f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3700: 28 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  (pOldExpr = pOld
3710: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
3720: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e    if( pOldExpr->
3730: 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65  span.z!=0 && pNe
3740: 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f  wExpr ){.      /
3750: 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20  * Always make a 
3760: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e  copy of the span
3770: 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65   for top-level e
3780: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
3790: 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
37a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
37b0: 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54   logic in SELECT
37c0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
37d0: 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20   determines.    
37e0: 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f    ** the names o
37f0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
3800: 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64   result set need
3810: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
3820: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
3830: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e  te3TokenCopy(&pN
3840: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
3850: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
3860: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
3870: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
3880: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
3890: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
38a0: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
38b0: 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69  pan.z==0 || sqli
38c0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
38d0: 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  d );.    pItem->
38e0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
38f0: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
3900: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
3910: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
3920: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
3930: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73  r;.    pItem->is
3940: 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Agg = pOldItem->
3950: 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d  isAgg;.    pItem
3960: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ->done = 0;.  }.
3970: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3980: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
3990: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
39a0: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
39b0: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
39c0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
39d0: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
39e0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
39f0: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
3a00: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
3a10: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
3a20: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
3a30: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
3a40: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
3a50: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
3a60: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
3a70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
3a80: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
3a90: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
3aa0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
3ab0: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
3ac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
3ad0: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
3ae0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
3af0: 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53  SrcList *p){.  S
3b00: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
3b10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
3b20: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
3b30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
3b40: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
3b50: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
3b60: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
3b70: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
3b80: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
3b90: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79  teMallocRaw( nBy
3ba0: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
3bb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3bc0: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
3bd0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
3be0: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
3bf0: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
3c00: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
3c10: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
3c20: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
3c30: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
3c40: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
3c50: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
3c60: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
3c70: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
3c80: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
3c90: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
3ca0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
3cb0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
3cc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
3cd0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  up(pOldItem->zNa
3ce0: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
3cf0: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
3d00: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3d10: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
3d20: 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pNewItem->jointy
3d30: 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a  pe = pOldItem->j
3d40: 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65  ointype;.    pNe
3d50: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
3d60: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
3d70: 6f 72 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  or;.    pTab = p
3d80: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
3d90: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
3da0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
3db0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
3dc0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
3dd0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
3de0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
3df0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  up(pOldItem->pSe
3e00: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49  lect);.    pNewI
3e10: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
3e20: 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74  e3ExprDup(pOldIt
3e30: 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e  em->pOn);.    pN
3e40: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
3e50: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
3e60: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  p(pOldItem->pUsi
3e70: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
3e80: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
3e90: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
3ea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3eb0: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
3ec0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64  ite3IdListDup(Id
3ed0: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
3ee0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
3ef0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
3f00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3f10: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
3f20: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  aw( sizeof(*pNew
3f30: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
3f40: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3f50: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65   pNew->nId = pNe
3f60: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
3f70: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
3f80: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3f90: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
3fa0: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
3fb0: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
3fc0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e     sqliteFree(pN
3fd0: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
3fe0: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
3ff0: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
4000: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
4010: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
4020: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
4030: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
4040: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
4050: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
4060: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
4070: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
4080: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
4090: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
40a0: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
40b0: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
40c0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
40d0: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
40e0: 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b  tDup(Select *p){
40f0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
4100: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
4110: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
4120: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
4130: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
4140: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
4150: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4160: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
4170: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
4180: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
4190: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
41a0: 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  p(p->pEList);.  
41b0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
41c0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70  ite3SrcListDup(p
41d0: 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d  ->pSrc);.  pNew-
41e0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
41f0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65  3ExprDup(p->pWhe
4200: 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  re);.  pNew->pGr
4210: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
4220: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47  xprListDup(p->pG
4230: 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d  roupBy);.  pNew-
4240: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
4250: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61  e3ExprDup(p->pHa
4260: 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ving);.  pNew->p
4270: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
4280: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
4290: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65  pOrderBy);.  pNe
42a0: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
42b0: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
42c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
42d0: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70  (p->pPrior);.  p
42e0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
42f0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
4300: 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d  pLimit);.  pNew-
4310: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
4320: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4f 66  e3ExprDup(p->pOf
4330: 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69  fset);.  pNew->i
4340: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e  Limit = -1;.  pN
4350: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31  ew->iOffset = -1
4360: 3b 0a 20 20 70 4e 65 77 2d 3e 70 70 4f 70 65 6e  ;.  pNew->ppOpen
4370: 56 69 72 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70  Virtual = 0;.  p
4380: 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20  New->isResolved 
4390: 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 3b  = p->isResolved;
43a0: 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20 3d  .  pNew->isAgg =
43b0: 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 72 65 74   p->isAgg;.  ret
43c0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
43d0: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
43e0: 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63  3SelectDup(Selec
43f0: 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t *p){.  assert(
4400: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
4410: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
4420: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
4430: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
4440: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
4450: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
4460: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
4470: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
4480: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
4490: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
44a0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
44b0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
44c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
44d0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f   Expr *pExpr, To
44e0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
44f0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
4500: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
4510: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
4520: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
4530: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
4540: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
4550: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  em;.    }.    as
4560: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c  sert( pList->nAl
4570: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  loc==0 );.  }.  
4580: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  if( pList->nAllo
4590: 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  c<=pList->nExpr 
45a0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
45b0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
45c0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
45d0: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
45e0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
45f0: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
4600: 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d   n*sizeof(pList-
4610: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
4620: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
4630: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
4640: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
4650: 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   a;.    pList->n
4660: 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20  Alloc = n;.  }. 
4670: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
4680: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  a!=0 );.  if( pE
4690: 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a  xpr || pName ){.
46a0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
46b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
46c0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
46d0: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
46e0: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
46f0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
4700: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
4710: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
4720: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
4730: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
4740: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
4750: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
4760: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
4770: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
4780: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
4790: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
47a0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
47b0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
47c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
47d0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
47e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
47f0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
4800: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
4810: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
4820: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4830: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
4840: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
4850: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
4860: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
4870: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
4880: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4890: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28  pList->a!=0 || (
48a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
48b0: 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  && pList->nAlloc
48c0: 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
48d0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  ( pList->nExpr<=
48e0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b  pList->nAlloc );
48f0: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
4900: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
4910: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
4920: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
4930: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4940: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  (pItem->pExpr);.
4950: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4960: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
4970: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4980: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
4990: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
49a0: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
49b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
49c0: 20 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72    Call xFunc for
49d0: 20 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74   each node visit
49e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
49f0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
4a00: 78 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73  xFunc determines
4a10: 20 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65   whether the tre
4a20: 65 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73  e walk continues
4a30: 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e  ..** 0 means con
4a40: 74 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68  tinue walking th
4a50: 65 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73  e tree.  1 means
4a60: 20 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69   do not walk chi
4a70: 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ldren.** of the 
4a80: 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74  current node but
4a90: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73   continue with s
4aa0: 69 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e  iblings.  2 mean
4ab0: 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65  s abandon.** the
4ac0: 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c   tree walk compl
4ad0: 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etely..**.** The
4ae0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
4af0: 6f 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  om this routine 
4b00: 69 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20  is 1 to abandon 
4b10: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a  the tree walk.**
4b20: 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e   and 0 to contin
4b30: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
4b40: 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45  t walkExprList(E
4b50: 78 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28  xprList *, int (
4b60: 2a 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  *)(void *, Expr*
4b70: 29 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74  ), void *);.stat
4b80: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54  ic int walkExprT
4b90: 72 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ree(Expr *pExpr,
4ba0: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
4bb0: 69 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64  id*,Expr*), void
4bc0: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
4bd0: 63 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  c;.  if( pExpr==
4be0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4bf0: 72 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41  rc = (*xFunc)(pA
4c00: 72 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  rg, pExpr);.  if
4c10: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
4c20: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
4c30: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46  pExpr->pLeft, xF
4c40: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4c50: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77  urn 1;.    if( w
4c60: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
4c70: 72 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63  r->pRight, xFunc
4c80: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
4c90: 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   1;.    if( walk
4ca0: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
4cb0: 70 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41  pList, xFunc, pA
4cc0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4cd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e    }.  return rc>
4ce0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  1;.}../*.** Call
4cf0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
4d00: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
4d10: 73 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a  sion in list p..
4d20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
4d30: 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  lkExprList(ExprL
4d40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ist *p, int (*xF
4d50: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
4d60: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
4d80: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4d90: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
4da0: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
4db0: 20 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c   for(i=p->nExpr,
4dc0: 20 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30   pItem=p->a; i>0
4dd0: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
4de0: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4df0: 72 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78  rTree(pItem->pEx
4e00: 70 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  pr, xFunc, pArg)
4e10: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
4e20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4e30: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45  /*.** Call walkE
4e40: 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76  xprTree() for ev
4e50: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
4e60: 6e 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20  n Select p, not 
4e70: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70  including.** exp
4e80: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
4e90: 65 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65  e part of sub-se
4ea0: 6c 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f  lects in any FRO
4eb0: 4d 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20  M clause or the 
4ec0: 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53  LIMIT.** or OFFS
4ed0: 45 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e  ET expressions..
4ee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4ef0: 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65  alkSelectExpr(Se
4f00: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78  lect *p, int (*x
4f10: 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78  Func)(void *, Ex
4f20: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  pr*), void *pArg
4f30: 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  ){.  walkExprLis
4f40: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75  t(p->pEList, xFu
4f50: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
4f60: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68  kExprTree(p->pWh
4f70: 65 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ere, xFunc, pArg
4f80: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  );.  walkExprLis
4f90: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78  t(p->pGroupBy, x
4fa0: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
4fb0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70  alkExprTree(p->p
4fc0: 48 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70  Having, xFunc, p
4fd0: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
4fe0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
4ff0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
5000: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
5010: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5020: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
5030: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
5040: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
5050: 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61  *.** pArg is rea
5060: 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
5070: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66   an integer.  If
5080: 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20   we can tell by 
5090: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45  looking.** at pE
50a0: 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70  xpr that the exp
50b0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
50c0: 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e  tains pExpr is n
50d0: 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ot a constant.**
50e0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
50f0: 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30  n set *pArg to 0
5100: 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f   and return 2 to
5110: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
5120: 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45  e walk..** If pE
5130: 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f  xpr does does no
5140: 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65  t disqualify the
5150: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
5160: 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e   being a constan
5170: 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74  t.** then do not
5180: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  hing..**.** Afte
5190: 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68  r walking the wh
51a0: 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20  ole tree, if no 
51b0: 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20  nodes are found 
51c0: 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a  that disqualify.
51d0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
51e0: 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n as constant, t
51f0: 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68  hen we assume th
5200: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
5210: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e  on.** is constan
5220: 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  t.  See sqlite3E
5230: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
5240: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
5250: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
5260: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
5270: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69  deIsConstant(voi
5280: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
5290: 45 78 70 72 29 7b 0a 20 20 73 77 69 74 63 68 28  Expr){.  switch(
52a0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
52b0: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
52c0: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
52d0: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
52e0: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
52f0: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
5300: 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a  * and *pArg==2 *
5310: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
5320: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
5330: 28 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 3d  ( *((int*)pArg)=
5340: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
5350: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
5360: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
5370: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
5380: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
5390: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20  case TK_DOT:.   
53a0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
53b0: 43 54 49 4f 4e 3a 0a 23 69 66 6e 64 65 66 20 53  CTION:.#ifndef S
53c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
53d0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
53e0: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
53f0: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64   TK_EXISTS:.#end
5400: 69 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a  if.      *((int*
5410: 29 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20  )pArg) = 0;.    
5420: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
5430: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
5440: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
5450: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
5460: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5470: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
5480: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
5490: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
54a0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
54b0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
54c0: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
54d0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
54e0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
54f0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
5500: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
5510: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
5520: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
5530: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
5540: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
5550: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
5560: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
5570: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
5580: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
5590: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
55a0: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
55b0: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
55c0: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
55d0: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
55e0: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
55f0: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
5600: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
5610: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
5620: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
5630: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
5640: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
5650: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
5660: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
5670: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
5680: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
5690: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
56a0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
56b0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
56c0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
56d0: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
56e0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
56f0: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
5700: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
5710: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
5720: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
5730: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5740: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
5750: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
5760: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
5770: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
5780: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
5790: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
57a0: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
57b0: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
57c0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
57d0: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
57e0: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
57f0: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
5800: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
5810: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
5820: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
5830: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
5840: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
5850: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
5860: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5870: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
5880: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
5890: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
58a0: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
58b0: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
58c0: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
58d0: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
58e0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
58f0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
5900: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
5910: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
5920: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
5930: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
5940: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5950: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b  3GetInt32(p->tok
5960: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b  en.z, pValue) ){
5970: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5980: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
59a0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
59b0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
59c0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
59d0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
59e0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Value);.    }.  
59f0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
5a00: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
5a10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
5a20: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
5a30: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
5a40: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
5a50: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
5a60: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5a70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5a80: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5a90: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
5aa0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5ab0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5ac0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
5ad0: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
5ae0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
5af0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
5b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
5b10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5b20: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
5b30: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
5b40: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
5b50: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
5b60: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
5b70: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
5b80: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
5b90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
5ba0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5bb0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
5bc0: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
5bd0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
5be0: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
5bf0: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
5c00: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
5c10: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
5c20: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
5c30: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
5c40: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
5c50: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
5c60: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
5c70: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
5c80: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
5c90: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
5ca0: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
5cb0: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
5cc0: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
5cd0: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
5ce0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5cf0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  holding.**      
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a     the table..**
5d20: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
5d30: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
5d40: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
5d50: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5d60: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
5d90: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
5da0: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
5db0: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
5dc0: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
5dd0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
5de0: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
5df0: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
5e00: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
5e10: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
5e20: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
5e30: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
5e40: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
5e50: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
5e60: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
5e70: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
5e80: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
5e90: 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65  *.** The pDbToke
5ea0: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
5eb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
5ec0: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
5ed0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
5ee0: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
5ef0: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
5f00: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
5f10: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
5f20: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
5f30: 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62   used.  The pTab
5f40: 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  leToken is the n
5f50: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5f60: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
5f70: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
5f80: 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b  e NULL if pDbTok
5f90: 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  en is also NULL.
5fa0: 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e    If pTableToken
5fb0: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
5fc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
5fd0: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
5fe0: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
5ff0: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
6000: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
6010: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
6020: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
6030: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
6040: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
6050: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
6060: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
6070: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
6080: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e    Return zero on
6090: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
60a0: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
60b0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
60c0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
60d0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
60e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
60f0: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
6100: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
6110: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
6120: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
6130: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
6140: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
6150: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
6160: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
6170: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
6180: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
6190: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
61a0: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
61b0: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
61c0: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
61d0: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
61e0: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
61f0: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
6200: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
6210: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
6220: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
6230: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
6240: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
6250: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
6260: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
6270: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
6280: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
6290: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
62a0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
62b0: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
62c0: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
62d0: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
62e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
62f0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
6300: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
6310: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
6320: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
6330: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
6340: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6350: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
6360: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
6370: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
6380: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6390: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
63a0: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
63b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
63c0: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
63d0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72  atabase */.  str
63e0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
63f0: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
6400: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
6410: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
6420: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
6430: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
6440: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
6450: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
6460: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
6470: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
6480: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
6490: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
64a0: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
64b0: 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
64c0: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26   pColumnToken &&
64d0: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
64e0: 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20   ); /* The Z in 
64f0: 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20  X.Y.Z cannot be 
6500: 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20  NULL */.  zDb = 
6510: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6520: 6f 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a  oken(pDbToken);.
6530: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33    zTab = sqlite3
6540: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
6550: 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43  ableToken);.  zC
6560: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
6570: 46 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d  FromToken(pColum
6580: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73  nToken);.  if( s
6590: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
65a0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
65b0: 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b   lookupname_end;
65c0: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69  .  }..  pExpr->i
65d0: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68  Table = -1;.  wh
65e0: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
65f0: 3d 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  =0 ){.    SrcLis
6600: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
6610: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
6620: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6630: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
6640: 0a 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ..    /* assert(
6650: 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69   zTab==0 || pELi
6660: 73 74 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20  st==0 ); */.    
6670: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
6680: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
6690: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
66a0: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
66b0: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
66c0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
66d0: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
66e0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 43 6f  pTab;.        Co
66f0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20  lumn *pCol;.  . 
6700: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d         if( pTab=
6710: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
6720: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6730: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
6740: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20         if( zTab 
6750: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6760: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
6770: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
6780: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
6790: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
67a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
67b0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
67c0: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
67d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
67e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
67f0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
6800: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
6810: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
6820: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
6830: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
6840: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
6850: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
6860: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6870: 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71  if( zDb!=0 && sq
6880: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
6890: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
68a0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
68b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
68c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
68d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
68e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
68f0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e        if( 0==(cn
6900: 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20  tTab++) ){.     
6910: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
6920: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
6930: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sor;.          p
6940: 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62  Expr->iDb = pTab
6950: 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  ->iDb;.         
6960: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
6970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6980: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c     for(j=0, pCol
6990: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
69a0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
69b0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
69c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
69d0: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
69e0: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
69f0: 20 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73             IdLis
6a00: 74 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t *pUsing;.     
6a10: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
6a20: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6a30: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
6a40: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
6a50: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
6a60: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Item;.          
6a70: 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70    pExpr->iDb = p
6a80: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20  Tab->iDb;.      
6a90: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
6aa0: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
6ab0: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
6ac0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
6ad0: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
6ae0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6af0: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
6b00: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
6b10: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6b20: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
6b30: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
6b40: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
6b50: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
6b60: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
6b70: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
6b80: 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e   if( pItem->join
6b90: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
6ba0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
6bb0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61     /* If this ma
6bc0: 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20  tch occurred in 
6bd0: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
6be0: 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e  f a natural join
6bf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6c00: 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ** then skip the
6c10: 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20   right table to 
6c20: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
6c30: 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  e match */.     
6c40: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b           pItem++
6c50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6c60: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
6c70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
6c80: 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74  f( (pUsing = pIt
6c90: 65 6d 2d 3e 70 55 73 69 6e 67 29 21 3d 30 20 29  em->pUsing)!=0 )
6ca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6cb0: 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68  /* If this match
6cc0: 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c   occurs on a col
6cd0: 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74  umn that is in t
6ce0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  he USING clause.
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
6d00: 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70   of a join, skip
6d10: 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74   the search of t
6d20: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
6d30: 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20  f the join.     
6d40: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61           ** to a
6d50: 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65  void a duplicate
6d60: 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f   match there. */
6d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
6d80: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
6d90: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
6da0: 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29  Using->nId; k++)
6db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6dc0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6dd0: 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b  ICmp(pUsing->a[k
6de0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
6df0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6e00: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
6e30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
6e60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
6e80: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
6e90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6ea0: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
6eb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
6ec0: 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  GER.    /* If we
6ed0: 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
6ee0: 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e  y resolved the n
6ef0: 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  ame, then maybe 
6f00: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20  .    ** it is a 
6f10: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
6f20: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
6f30: 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f  reference.    */
6f40: 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20  .    if( zDb==0 
6f50: 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e  && zTab!=0 && cn
6f60: 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  t==0 && pParse->
6f70: 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a  trigStack!=0 ){.
6f80: 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61        TriggerSta
6f90: 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63  ck *pTriggerStac
6fa0: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  k = pParse->trig
6fb0: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62  Stack;.      Tab
6fc0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
6fd0: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
6fe0: 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d  Stack->newIdx !=
6ff0: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
7000: 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61  rICmp("new", zTa
7010: 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20  b) == 0 ){.     
7020: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
7030: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
7040: 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20  ->newIdx;.      
7050: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
7060: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
7070: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
7080: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
7090: 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Tab;.      }else
70a0: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61   if( pTriggerSta
70b0: 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31  ck->oldIdx != -1
70c0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
70d0: 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d  mp("old", zTab)=
70e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
70f0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54  xpr->iTable = pT
7100: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
7110: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Idx;.        ass
7120: 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61  ert( pTriggerSta
7130: 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20  ck->pTab );.    
7140: 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67      pTab = pTrig
7150: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a  gerStack->pTab;.
7160: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7170: 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20  f( pTab ){ .    
7180: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
7190: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
71a0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20  = pTab->aCol;.. 
71b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
71c0: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
71d0: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
71e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
71f0: 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  ; j < pTab->nCol
7200: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b  ; j++, pCol++) {
7210: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
7220: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
7230: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
7240: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7250: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
7260: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
7270: 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e  lumn = j==pTab->
7280: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a  iPKey ? -1 : j;.
7290: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
72a0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
72b0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69  ab->aCol[j].affi
72c0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nity;.          
72d0: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
72e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70   pTab->aCol[j].p
72f0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
7300: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
7310: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
7320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7330: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
7350: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
7360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
7370: 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a  GER) */..    /*.
7380: 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74      ** Perhaps t
7390: 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66  he name is a ref
73a0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f  erence to the RO
73b0: 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  WID.    */.    i
73c0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74  f( cnt==0 && cnt
73d0: 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  Tab==1 && sqlite
73e0: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29  3IsRowid(zCol) )
73f0: 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b  {.      cnt = 1;
7400: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
7410: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
7420: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
7430: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
7440: 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20  NTEGER;.    }.. 
7450: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
7460: 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20  the input is of 
7470: 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20  the form Z (not 
7480: 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68  Y.Z or X.Y.Z) th
7490: 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20  en the name Z.  
74a0: 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72    ** might refer
74b0: 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65   to an result-se
74c0: 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68  t alias.  This h
74d0: 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
74e0: 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  ple, when.    **
74f0: 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e   we are resolvin
7500: 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57  g names in the W
7510: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
7520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
7530: 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mand:.    **.   
7540: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
7550: 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62  +b AS x FROM tab
7560: 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20  le WHERE x<10;. 
7570: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
7580: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c  cases like this,
7590: 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77   replace pExpr w
75a0: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
75b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
75c0: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74  t.    ** forms t
75d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e  he result set en
75e0: 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68  try ("a+b" in th
75f0: 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72  e example) and r
7600: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
7610: 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  y..    ** Note t
7620: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
7630: 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
7640: 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65   set should have
7650: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
7660: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79    ** resolved by
7670: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48   the time the WH
7680: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65  ERE clause is re
7690: 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  solved..    */. 
76a0: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
76b0: 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 7a 54   pEList!=0 && zT
76c0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ab==0 ){.      f
76d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
76e0: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
76f0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73         char *zAs
7700: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
7710: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
7720: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
7730: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
7740: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
7750: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7760: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
7770: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
7780: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
7790: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
77a0: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  S;.          pEx
77b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  pr->iColumn = j;
77c0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
77d0: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
77e0: 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
77f0: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
7800: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b          cnt = 1;
7810: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
7820: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
7830: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
7840: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
7850: 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20  e_end_2;.       
7860: 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
7870: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  }..    /* Advanc
7880: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61  e to the next na
7890: 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65  me context.  The
78a0: 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20   loop will exit 
78b0: 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20  when either.    
78c0: 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74  ** we have a mat
78d0: 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68  ch (cnt>0) or wh
78e0: 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  en we run out of
78f0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a   name contexts..
7900: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
7910: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nt==0 ){.      p
7920: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
7930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7940: 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59  .  ** If X and Y
7950: 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74   are NULL (in ot
7960: 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c  her words if onl
7970: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
7980: 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70  e Z is.  ** supp
7990: 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61  lied) and the va
79a0: 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c  lue of Z is encl
79b0: 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71  osed in double-q
79c0: 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a  uotes, then.  **
79d0: 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c   Z is a string l
79e0: 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65  iteral if it doe
79f0: 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63  sn't match any c
7a00: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e  olumn names.  In
7a10: 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c   that.  ** case,
7a20: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75   we need to retu
7a30: 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e  rn right away an
7a40: 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63  d not make any c
7a50: 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70  hanges to.  ** p
7a60: 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Expr..  **.  ** 
7a70: 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72  Because no refer
7a80: 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f  ence was made to
7a90: 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c   outer contexts,
7aa0: 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20   the pNC->nRef. 
7ab0: 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e   ** fields are n
7ac0: 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e  ot changed in an
7ad0: 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  y context..  */.
7ae0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
7af0: 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75  zTab==0 && pColu
7b00: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27  mnToken->z[0]=='
7b10: 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  "' ){.    sqlite
7b20: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  Free(zCol);.    
7b30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
7b40: 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20   /*.  ** cnt==0 
7b50: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20  means there was 
7b60: 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e  not match.  cnt>
7b70: 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65  1 means there we
7b80: 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d  re two or.  ** m
7b90: 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69  ore matches.  Ei
7ba0: 74 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76  ther way, we hav
7bb0: 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f  e an error..  */
7bc0: 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b  .  if( cnt!=1 ){
7bd0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30  .    char *z = 0
7be0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
7bf0: 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74  ;.    zErr = cnt
7c00: 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63  ==0 ? "no such c
7c10: 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d  olumn: %s" : "am
7c20: 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e  biguous column n
7c30: 61 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66  ame: %s";.    if
7c40: 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ( zDb ){.      s
7c50: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
7c60: 26 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54  &z, zDb, ".", zT
7c70: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
7c80: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
7c90: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73   zTab ){.      s
7ca0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
7cb0: 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  &z, zTab, ".", z
7cc0: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Col, 0);.    }el
7cd0: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
7ce0: 6c 69 74 65 53 74 72 44 75 70 28 7a 43 6f 6c 29  liteStrDup(zCol)
7cf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7d00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7d10: 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20  se, zErr, z);.  
7d20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
7d30: 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72  .    pTopNC->nEr
7d40: 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  r++;.  }..  /* I
7d50: 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  f a column from 
7d60: 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c  a table in pSrcL
7d70: 69 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65  ist is reference
7d80: 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20  d, then record. 
7d90: 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e   ** this fact in
7da0: 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b   the pSrcList.a[
7db0: 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73  ].colUsed bitmas
7dc0: 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75  k.  Column 0 cau
7dd0: 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74  ses.  ** bit 0 t
7de0: 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d  o be set.  Colum
7df0: 6e 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20  n 1 sets bit 1. 
7e00: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
7e10: 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75  If the.  ** colu
7e20: 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  mn number is gre
7e30: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75  ater than the nu
7e40: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
7e50: 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
7e60: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69   then set the hi
7e70: 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20  gh-order bit of 
7e80: 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a  the bitmask..  *
7e90: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69  /.  if( pExpr->i
7ea0: 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61  Column>=0 && pMa
7eb0: 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  tch!=0 ){.    in
7ec0: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  t n = pExpr->iCo
7ed0: 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e  lumn;.    if( n>
7ee0: 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  =sizeof(Bitmask)
7ef0: 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  *8 ){.      n = 
7f00: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
7f10: 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  8-1;.    }.    a
7f20: 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69  ssert( pMatch->i
7f30: 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69  Cursor==pExpr->i
7f40: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61  Table );.    pMa
7f50: 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20  tch->colUsed |= 
7f60: 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75  1<<n;.  }..looku
7f70: 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20  pname_end:.  /* 
7f80: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
7f90: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
7fa0: 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71  eFree(zDb);.  sq
7fb0: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
7fc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7fd0: 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ete(pExpr->pLeft
7fe0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  );.  pExpr->pLef
7ff0: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
8000: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
8010: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
8020: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a  pr->pRight = 0;.
8030: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
8040: 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e  _COLUMN;.lookupn
8050: 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c  ame_end_2:.  sql
8060: 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  iteFree(zCol);. 
8070: 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20   if( cnt==1 ){. 
8080: 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d     assert( pNC!=
8090: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
80a0: 41 75 74 68 52 65 61 64 28 70 50 61 72 73 65 2c  AuthRead(pParse,
80b0: 20 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72   pExpr, pNC->pSr
80c0: 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  cList);.    if( 
80d0: 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63  pMatch && !pMatc
80e0: 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  h->pSelect ){.  
80f0: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
8100: 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a  = pMatch->pTab;.
8110: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63      }.    /* Inc
8120: 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20  rement the nRef 
8130: 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d  value on all nam
8140: 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20  e contexts from 
8150: 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20  TopNC up to.    
8160: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65  ** the point whe
8170: 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63  re the name matc
8180: 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hed. */.    for(
8190: 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ;;){.      asser
81a0: 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a  t( pTopNC!=0 );.
81b0: 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52        pTopNC->nR
81c0: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ef++;.      if( 
81d0: 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72  pTopNC==pNC ) br
81e0: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  eak;.      pTopN
81f0: 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78  C = pTopNC->pNex
8200: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
8210: 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 0;.  } else 
8220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
8230: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
8240: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
8250: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
8260: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
8270: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  ee()..**.** Reso
8280: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
8290: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
82a0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
82b0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
82c0: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
82d0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
82e0: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
82f0: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
8300: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
8310: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
8320: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
8330: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
8340: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
8350: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
8360: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
8370: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
8380: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
8390: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
83a0: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
83b0: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
83c0: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
83d0: 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f  tic int nameReso
83e0: 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70  lverStep(void *p
83f0: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
8400: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
8410: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
8420: 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 53 72  text*)pArg;.  Sr
8430: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 3b  cList *pSrcList;
8440: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8450: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
8460: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
8470: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
8480: 3b 0a 20 20 70 53 72 63 4c 69 73 74 20 3d 20 70  ;.  pSrcList = p
8490: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
84a0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
84b0: 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70  arse;..  if( Exp
84c0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
84d0: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
84e0: 65 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ed) ) return 1;.
84f0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
8500: 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f  y(pExpr, EP_Reso
8510: 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e  lved);.#ifndef N
8520: 44 45 42 55 47 0a 20 20 69 66 28 20 70 53 72 63  DEBUG.  if( pSrc
8530: 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  List ){.    int 
8540: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
8550: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
8560: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
8570: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
8580: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
8590: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
85a0: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
85b0: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
85c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
85d0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
85e0: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
85f0: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
8600: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
8610: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
8620: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
8630: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
8640: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
8650: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
8660: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
8670: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
8680: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
8690: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
86a0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
86b0: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
86c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
86d0: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
86e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
86f0: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
8700: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
8710: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
8720: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
8730: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
8740: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
8750: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
8760: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
8770: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
8780: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
8790: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
87a0: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
87b0: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
87c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
87d0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
87e0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
87f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
8800: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
8810: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
8820: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
8830: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
8840: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
8850: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
8860: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
8870: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
8880: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
8890: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
88a0: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
88b0: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
88c0: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
88d0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
88e0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
88f0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
8900: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
8910: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
8920: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
8930: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
8940: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
8950: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
8960: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
8980: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
8990: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
89a0: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
89b0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
89c0: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
89d0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
89e0: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
89f0: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
8a00: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
8a10: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
8a20: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
8a30: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
8a40: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
8a50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8a60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
8a70: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
8a80: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
8a90: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
8aa0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
8ab0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
8ac0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8ad0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
8ae0: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
8af0: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
8b00: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
8b10: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
8b20: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
8b30: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8b40: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
8b50: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
8b60: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
8b70: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
8b80: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
8b90: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
8ba0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8bb0: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
8bc0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8bd0: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
8be0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8bf0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
8c00: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
8c10: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
8c20: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
8c30: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
8c40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8c50: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
8c60: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
8c70: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
8c80: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
8c90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
8ca0: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
8cb0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
8cc0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
8cd0: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
8ce0: 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69  about the functi
8cf0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
8d00: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
8d10: 2d 3e 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64  ->enc;  /* The d
8d20: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
8d30: 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d   */..      zId =
8d40: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b   pExpr->token.z;
8d50: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
8d60: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
8d70: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
8d80: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
8d90: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
8da0: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
8db0: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
8dc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
8dd0: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
8de0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
8df0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
8e00: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
8e10: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
8e20: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
8e30: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
8e40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8e50: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
8e60: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
8e70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8e80: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
8e90: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
8ea0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
8eb0: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
8ec0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
8ed0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8ee0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8ef0: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
8f00: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
8f10: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
8f20: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
8f30: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
8f40: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
8f50: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
8f60: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
8f70: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8f80: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
8f90: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
8fa0: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
8fb0: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
8fc0: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
8fd0: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
8fe0: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
8ff0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9000: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
9010: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
9020: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
9030: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
9040: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
9050: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
9060: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
9070: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
9080: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
9090: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
90a0: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
90b0: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
90c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
90d0: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
90e0: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
90f0: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
9100: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
9110: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
9120: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
9130: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
9140: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
9150: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
9160: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
9170: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
9180: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
9190: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
91a0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
91b0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
91c0: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
91d0: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
91e0: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
91f0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
9200: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
9210: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9220: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
9230: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
9240: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
9250: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
9260: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
9270: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
9280: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
9290: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
92a0: 52 65 66 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Ref;.        sql
92b0: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
92c0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
92d0: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
92e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
92f0: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
9300: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
9310: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
9320: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
9330: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
9340: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
9350: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9360: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9370: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9380: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9390: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
93a0: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
93b0: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
93c0: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
93d0: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
93e0: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
93f0: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
9400: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
9410: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
9420: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
9430: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
9440: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
9450: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
9460: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
9470: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
9480: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
9490: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
94a0: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
94b0: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
94c0: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
94d0: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
94e0: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
94f0: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
9500: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
9510: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
9520: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
9530: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
9540: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
9550: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
9560: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
9570: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
9580: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
9590: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
95a0: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
95b0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
95c0: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
95d0: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
95e0: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
95f0: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
9600: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
9610: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
9620: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
9630: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
9640: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
9650: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
9660: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
9670: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
9680: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
9690: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
96a0: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
96b0: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
96c0: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
96d0: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
96e0: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
96f0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
9700: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
9710: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
9720: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
9730: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
9740: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
9750: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
9760: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9770: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
9780: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
9790: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
97a0: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
97b0: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
97c0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
97d0: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
97e0: 6c 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65  lveNames(.  Name
97f0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
9800: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
9810: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
9820: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
9830: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
9840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9850: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
9860: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
9870: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
9880: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 61  ) return 0;.  wa
9890: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
98a0: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
98b0: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28 20  ep, pNC);.  if( 
98c0: 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  pNC->nErr>0 ){. 
98d0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
98e0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
98f0: 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  or);.  }.  retur
9900: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
9910: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
9920: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  r);.}../*.** A p
9930: 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20  ointer instance 
9940: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
9950: 65 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73  e is used to pas
9960: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
9970: 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70   through walkExp
9980: 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53  rTree into codeS
9990: 75 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a  ubqueryStep()..*
99a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
99b0: 20 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72   QueryCoder Quer
99c0: 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51  yCoder;.struct Q
99d0: 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61  ueryCoder {.  Pa
99e0: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
99f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
9a00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e  g context */.  N
9a10: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b  ameContext *pNC;
9a20: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
9a30: 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73   of first enclos
9a40: 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a  ing query */.};.
9a50: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9a60: 20 63 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65   code for subque
9a70: 72 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72  ries and IN oper
9a80: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20  ators..**.** IN 
9a90: 6f 70 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20  operators comes 
9aa0: 69 6e 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  in two forms:.**
9ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
9ac0: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
9ad0: 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  .** and.**      
9ae0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
9af0: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
9b00: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
9b10: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65  s handled by cre
9b20: 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64  ating a set hold
9b30: 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20  ing the list.** 
9b40: 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  of allowed value
9b50: 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  s.  The second f
9b60: 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53  orm causes the S
9b70: 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74  ELECT to generat
9b80: 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  e .** a temporar
9b90: 79 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  y table..*/.#ifn
9ba0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9bb0: 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71  SUBQUERY.void sq
9bc0: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
9bd0: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
9be0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9bf0: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
9c00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
9c20: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
9c30: 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ss */.  Vdbe *v 
9c40: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
9c50: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
9c60: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
9c70: 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
9c80: 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
9c90: 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
9ca0: 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
9cb0: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
9cc0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
9cd0: 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
9ce0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
9cf0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
9d00: 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
9d10: 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
9d20: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
9d30: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
9d40: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
9d50: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
9d60: 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
9d70: 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
9d80: 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
9d90: 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
9da0: 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
9db0: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
9dc0: 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
9dd0: 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
9de0: 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
9df0: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
9e00: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
9e10: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
9e20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
9e30: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
9e40: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
9e50: 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d  ect) && !pParse-
9e60: 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
9e70: 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72    int mem = pPar
9e80: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
9e90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9ea0: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
9eb0: 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  mem, 0);.    tes
9ec0: 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
9ed0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9ee0: 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73  f, 0, 0);.    as
9ef0: 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30  sert( testAddr>0
9f00: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9f10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9f20: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20  nteger, 1, 0);. 
9f30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9f40: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
9f50: 72 65 2c 20 6d 65 6d 2c 20 31 29 3b 0a 20 20 7d  re, mem, 1);.  }
9f60: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ..  if( pExpr->p
9f70: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
9f80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9f90: 2c 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50  , OP_AggContextP
9fa0: 75 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ush, 0, 0);.  }.
9fb0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9fc0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
9fd0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
9fe0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
9ff0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
a000: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
a010: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
a020: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
a030: 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75  enVirtual instru
a040: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
a050: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
a060: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
a070: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
a080: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
a090: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
a0a0: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
a0b0: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
a0c0: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
a0d0: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
a0e0: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
a0f0: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
a100: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
a110: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
a120: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
a130: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
a140: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
a150: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
a160: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
a170: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
a180: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
a190: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
a1a0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
a1b0: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
a1c0: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
a1d0: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
a1e0: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
a1f0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
a200: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
a210: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
a220: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
a230: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
a240: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
a250: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
a260: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
a270: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
a280: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a290: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
a2a0: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
a2b0: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
a2c0: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
a2d0: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
a2e0: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
a2f0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
a300: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
a310: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
a320: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
a330: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
a340: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
a350: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
a360: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a370: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a380: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a390: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 45  _OpenVirtual, pE
a3a0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
a3b0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
a3c0: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
a3d0: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
a3e0: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
a3f0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
a400: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a410: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
a420: 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
a430: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
a440: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
a450: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
a460: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
a470: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
a480: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
a490: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
a4a0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
a4b0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
a4c0: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
a4d0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
a4e0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
a4f0: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
a500: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
a510: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61  .        int iPa
a520: 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  rm = pExpr->iTab
a530: 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66  le +  (((int)aff
a540: 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20  inity)<<16);.   
a550: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
a560: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
a570: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
a580: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
a590: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
a5a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
a5b0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
a5c0: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
a5d0: 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d  , SRT_Set, iParm
a5e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
a5f0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
a600: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
a610: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
a620: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
a630: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
a640: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
a650: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62  nfo.aColl[0] = b
a660: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
a670: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
a680: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
a690: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
a6a0: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
a6b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a6c0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
a6d0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
a6e0: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
a6f0: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
a700: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20  .        **..** 
a710: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
a720: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
a730: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
a740: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
a750: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
a760: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
a770: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
a780: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
a790: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
a7a0: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
a7b0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
a7c0: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
a7d0: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
a7e0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
a7f0: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
a800: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a810: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
a820: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a830: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
a840: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
a850: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
a860: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a870: 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20 20 20  m *pItem;..     
a880: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
a890: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
a8a0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
a8b0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
a8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b       }.        k
a8d0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
a8e0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
a8f0: 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20  pColl;..        
a900: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
a910: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
a920: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
a930: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
a940: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
a950: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
a960: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
a970: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
a980: 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
a990: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
a9a0: 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
a9b0: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
a9c0: 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
a9d0: 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
a9e0: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
a9f0: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
aa00: 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
aa10: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
aa20: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
aa30: 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
aa40: 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
aa50: 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
aa60: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
aa70: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
aa80: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
aa90: 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
aaa0: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
aab0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
aac0: 28 20 74 65 73 74 41 64 64 72 3e 30 20 26 26 20  ( testAddr>0 && 
aad0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
aae0: 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
aaf0: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 4f             VdbeO
ab00: 70 20 2a 61 4f 70 20 3d 20 73 71 6c 69 74 65 33  p *aOp = sqlite3
ab10: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 74 65 73  VdbeGetOp(v, tes
ab20: 74 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20 20  tAddr-1);.      
ab30: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
ab40: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
ab50: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
ab60: 20 20 20 20 20 20 20 20 20 20 20 61 4f 70 5b 69             aOp[i
ab70: 5d 2e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ].opcode = OP_No
ab80: 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  op;.            
ab90: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  }.            te
aba0: 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  stAddr = 0;.    
abb0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
abc0: 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
abd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
abe0: 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
abf0: 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
ac00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
ac10: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ac20: 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20  rse, pE2);.     
ac30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac40: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
ac50: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
ac60: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
ac70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
ac90: 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
aca0: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
acb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
acc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
acd0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
ace0: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
acf0: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
ad00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ad10: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ..    case TK_EX
ad20: 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
ad30: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
ad40: 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f    /* This has to
ad50: 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c   be a scalar SEL
ad60: 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63  ECT.  Generate c
ad70: 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20  ode to put the. 
ad80: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
ad90: 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20   this select in 
ada0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  a memory cell an
adb0: 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  d record the num
adc0: 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ber.      ** of 
add0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
ade0: 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
adf0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73    */.      int s
ae00: 6f 70 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  op;.      Select
ae10: 20 2a 70 53 65 6c 3b 0a 0a 20 20 20 20 20 20 70   *pSel;..      p
ae20: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
ae30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
ae40: 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
ae50: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
ae60: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
ae70: 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20  ==TK_SELECT ){. 
ae80: 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54         sop = SRT
ae90: 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Mem;.      }els
aea0: 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  e{.        stati
aeb0: 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e  c const Token on
aec0: 65 20 3d 20 7b 20 22 31 22 2c 20 30 2c 20 31 20  e = { "1", 0, 1 
aed0: 7d 3b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d  };.        sop =
aee0: 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
aef0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
af00: 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d  ListDelete(pSel-
af10: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
af20: 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d    pSel->pEList =
af30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
af40: 41 70 70 65 6e 64 28 30 2c 20 0a 20 20 20 20 20  Append(0, .     
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
af70: 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20  (TK_INTEGER, 0, 
af80: 30 2c 20 26 6f 6e 65 29 2c 20 30 29 3b 0a 20 20  0, &one), 0);.  
af90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
afa0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
afb0: 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 70 45 78  , pSel, sop, pEx
afc0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 20  pr->iColumn, 0, 
afd0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
afe0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
aff0: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ..  if( pExpr->p
b000: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
b010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b020: 2c 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50  , OP_AggContextP
b030: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  op, 0, 0);.  }. 
b040: 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b   if( testAddr ){
b050: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b060: 43 68 61 6e 67 65 50 32 28 76 2c 20 74 65 73 74  ChangeP2(v, test
b070: 41 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62  Addr, sqlite3Vdb
b080: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
b090: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
b0a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b0b0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b0c0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
b0d0: 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
b0e0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
b0f0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
b100: 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
b110: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68   z[0..n-1] on th
b120: 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e stack..*/.stat
b130: 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
b140: 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  ger(Vdbe *v, con
b150: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
b160: 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
b170: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
b180: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
b190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1a0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
b1b0: 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   i, 0);.  }else 
b1c0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
b1d0: 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20  n64Bits(z) ){.  
b1e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
b1f0: 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c  (v, OP_Int64, 0,
b200: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c   0, z, n);.  }el
b210: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
b220: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  dbeOp3(v, OP_Rea
b230: 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  l, 0, 0, z, n);.
b240: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
b250: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
b260: 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
b270: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
b280: 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
b290: 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74  sion and leave t
b2a0: 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65  he result on the
b2b0: 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a   top of stack..*
b2c0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
b2d0: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
b2e0: 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
b2f0: 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
b300: 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
b310: 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
b320: 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
b330: 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
b340: 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
b350: 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
b360: 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
b370: 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
b380: 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
b390: 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
b3a0: 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
b3b0: 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
b3c0: 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
b3d0: 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
b3e0: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
b3f0: 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
b400: 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
b410: 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
b420: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b430: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
b440: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
b450: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
b460: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b470: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28  .  int op;.  if(
b480: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
b490: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
b4a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b4b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
b4c0: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65  l, 0, 0);.    re
b4d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20 3d  turn;.  }.  op =
b4e0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
b4f0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
b500: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
b510: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
b520: 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20 26 26 20  rse->fillAgg && 
b530: 70 45 78 70 72 2d 3e 69 41 67 67 3e 3d 30 20 29  pExpr->iAgg>=0 )
b540: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b550: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b560: 5f 41 67 67 47 65 74 2c 20 70 45 78 70 72 2d 3e  _AggGet, pExpr->
b570: 69 41 67 67 43 74 78 2c 20 70 45 78 70 72 2d 3e  iAggCtx, pExpr->
b580: 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iAgg);.      }el
b590: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  se if( pExpr->iC
b5a0: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
b5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b5c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
b5d0: 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
b5e0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
b5f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b600: 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28  e3ColumnDefault(
b610: 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 20  v, pExpr->pTab, 
b620: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
b630: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b650: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
b660: 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  id, pExpr->iTabl
b670: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
b680: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b690: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
b6a0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63  TEGER: {.      c
b6b0: 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45  odeInteger(v, pE
b6c0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
b6d0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  xpr->token.n);. 
b6e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b6f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  }.    case TK_FL
b700: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
b710: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
b720: 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41   assert( TK_FLOA
b730: 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20  T==OP_Real );.  
b740: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
b750: 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67  TRING==OP_String
b760: 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 );.      sqlit
b770: 65 33 44 65 71 75 6f 74 65 45 78 70 72 28 70 45  e3DequoteExpr(pE
b780: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
b790: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70  te3VdbeOp3(v, op
b7a0: 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74  , 0, 0, pExpr->t
b7b0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
b7c0: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62  oken.n);.      b
b7d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b7e0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
b7f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b800: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
b810: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
b820: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
b830: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b840: 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
b850: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
b860: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
b870: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b880: 2a 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  *z;.      assert
b890: 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65  ( TK_BLOB==OP_He
b8a0: 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 6e  xBlob );.      n
b8b0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
b8c0: 6e 20 2d 20 33 3b 0a 20 20 20 20 20 20 7a 20 3d  n - 3;.      z =
b8d0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20   pExpr->token.z 
b8e0: 2b 20 32 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 2;.      asser
b8f0: 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( n>=0 );.     
b900: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
b910: 20 20 20 20 20 7a 20 3d 20 22 22 3b 0a 20 20 20       z = "";.   
b920: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b930: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c  e3VdbeOp3(v, op,
b940: 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20   0, 0, z, n);.  
b950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b960: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
b970: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
b980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72  eAddOp(v, OP_Var
b9a0: 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54  iable, pExpr->iT
b9b0: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
b9c0: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
b9d0: 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  .n>1 ){.        
b9e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b9f0: 65 50 33 28 76 2c 20 2d 31 2c 20 70 45 78 70 72  eP3(v, -1, pExpr
ba00: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
ba10: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
ba20: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ba30: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ba40: 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
ba50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ba60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
ba70: 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  oad, pExpr->iTab
ba80: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  le, 0);.      br
ba90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
baa0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
bab0: 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
bac0: 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
bad0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
bae0: 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
baf0: 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
bb00: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66   */.      int af
bb10: 66 2c 20 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  f, op;.      sql
bb20: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
bb30: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
bb40: 74 29 3b 0a 20 20 20 20 20 20 61 66 66 20 3d 20  t);.      aff = 
bb50: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
bb60: 79 70 65 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65  ype(&pExpr->toke
bb70: 6e 29 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  n);.      switch
bb80: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ( aff ){.       
bb90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
bba0: 5f 49 4e 54 45 47 45 52 3a 20 20 20 6f 70 20 3d  _INTEGER:   op =
bbb0: 20 4f 50 5f 54 6f 49 6e 74 3b 20 20 20 20 20 20   OP_ToInt;      
bbc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
bbd0: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
bbe0: 55 4d 45 52 49 43 3a 20 20 20 6f 70 20 3d 20 4f  UMERIC:   op = O
bbf0: 50 5f 54 6f 4e 75 6d 65 72 69 63 3b 20 20 62 72  P_ToNumeric;  br
bc00: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
bc10: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  e SQLITE_AFF_TEX
bc20: 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  T:      op = OP_
bc30: 54 6f 54 65 78 74 3b 20 20 20 20 20 62 72 65 61  ToText;     brea
bc40: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
bc50: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a  SQLITE_AFF_NONE:
bc60: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 54 6f        op = OP_To
bc70: 42 6c 6f 62 3b 20 20 20 20 20 62 72 65 61 6b 3b  Blob;     break;
bc80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
bc90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bca0: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
bcb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bcc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bcd0: 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
bce0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
bcf0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
bd00: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
bd10: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
bd20: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
bd30: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
bd40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bd50: 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20  K_LT==OP_Lt );. 
bd60: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
bd70: 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20  LE==OP_Le );.   
bd80: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
bd90: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20  ==OP_Gt );.     
bda0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
bdb0: 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Ge );.      a
bdc0: 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50  ssert( TK_EQ==OP
bdd0: 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Eq );.      ass
bde0: 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  ert( TK_NE==OP_N
bdf0: 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e );.      sqlit
be00: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
be10: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
be20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
be30: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
be40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
be50: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
be60: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
be70: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
be80: 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29  Right, op, 0, 0)
be90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bea0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
beb0: 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
bec0: 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
bed0: 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
bee0: 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
bef0: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
bf00: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
bf10: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
bf20: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
bf30: 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
bf40: 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
bf50: 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
bf60: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
bf70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
bf80: 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
bf90: 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
bfa0: 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
bfb0: 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
bfc0: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
bfd0: 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
bfe0: 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  dd );.      asse
bff0: 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
c000: 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20  _Subtract );.   
c010: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
c020: 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
c030: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c040: 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
c050: 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  itAnd );.      a
c060: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
c070: 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20  =OP_BitOr );.   
c080: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c     assert( TK_SL
c090: 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29  ASH==OP_Divide )
c0a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c0b0: 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_LSHIFT==OP_Sh
c0c0: 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  iftLeft );.     
c0d0: 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
c0e0: 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
c0f0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
c100: 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50  t( TK_CONCAT==OP
c110: 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20  _Concat );.     
c120: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c130: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c140: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
c150: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c160: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
c170: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
c180: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c190: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
c1a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c1b0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
c1c0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
c1d0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
c1e0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
c1f0: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
c200: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
c210: 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c  ==TK_FLOAT || pL
c220: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
c230: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54  GER ){.        T
c240: 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74  oken *p = &pLeft
c250: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
c260: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
c270: 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20 2b 20  eMalloc( p->n + 
c280: 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 70 72  2 );.        spr
c290: 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73 22 2c  intf(z, "-%.*s",
c2a0: 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20   p->n, p->z);.  
c2b0: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
c2c0: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
c2d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c2e0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
c2f0: 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 70  Real, 0, 0, z, p
c300: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
c310: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c320: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
c330: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
c340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
c350: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
c360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c370: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
c380: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54  l through into T
c390: 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20  K_NOT */.    }. 
c3a0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
c3b0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
c3c0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OT: {.      asse
c3d0: 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f  rt( TK_BITNOT==O
c3e0: 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20  P_BitNot );.    
c3f0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
c400: 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20  ==OP_Not );.    
c410: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c420: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c430: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
c440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c450: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
c460: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c470: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
c480: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
c490: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
c4a0: 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20    int dest;.    
c4b0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e    assert( TK_ISN
c4c0: 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29  ULL==OP_IsNull )
c4d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c4e0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
c4f0: 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  otNull );.      
c500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c510: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
c520: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
c530: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c540: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
c550: 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d  t);.      dest =
c560: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
c570: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a  entAddr(v) + 2;.
c580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c590: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
c5a0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
c5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c5c0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
c5d0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
c5e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c5f0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
c600: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
c610: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c620: 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70  _AggGet, 0, pExp
c630: 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20  r->iAgg);.      
c640: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c650: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
c660: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
c670: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
c680: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
c690: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
c6a0: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  t;.      int nEx
c6b0: 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69  pr = pList ? pLi
c6c0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  st->nExpr : 0;. 
c6d0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
c6e0: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49  ef;.      int nI
c6f0: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
c700: 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20  har *zId;.      
c710: 69 6e 74 20 70 32 20 3d 20 30 3b 0a 20 20 20 20  int p2 = 0;.    
c720: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75    int i;.      u
c730: 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e  8 enc = pParse->
c740: 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 43  db->enc;.      C
c750: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
c760: 30 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  0;.      zId = p
c770: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
c780: 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72       nId = pExpr
c790: 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  ->token.n;.     
c7a0: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
c7b0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
c7c0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
c7d0: 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29  , nExpr, enc, 0)
c7e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c7f0: 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20  pDef!=0 );.     
c800: 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   nExpr = sqlite3
c810: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
c820: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b  (pParse, pList);
c830: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c840: 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b  i<nExpr && i<32;
c850: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
c860: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
c870: 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e  Constant(pList->
c880: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
c890: 20 20 20 20 20 20 20 20 20 70 32 20 7c 3d 20 28           p2 |= (
c8a0: 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  1<<i);.        }
c8b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
c8c0: 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26  f->needCollSeq &
c8d0: 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
c8e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
c8f0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c900: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
c910: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
c920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c930: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
c940: 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20  eedCollSeq ){.  
c950: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
c960: 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
c970: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
c980: 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
c990: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
c9a0: 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
c9b0: 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
c9c0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
c9d0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
c9e0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75  VdbeOp3(v, OP_Fu
c9f0: 6e 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70  nction, nExpr, p
ca00: 32 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  2, (char*)pDef, 
ca10: 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
ca20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ca30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ca40: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
ca50: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
ca60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
ca70: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
ca80: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
ca90: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  t(pParse, pExpr)
caa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cab0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
cac0: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
cad0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
cae0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
caf0: 2c 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65  , "# load subque
cb00: 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  ry result"));.  
cb10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
cb20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
cb30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
cb40: 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66  r;.      char af
cb50: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 73 71  finity;.      sq
cb60: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
cb70: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
cb80: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  );..      /* Fig
cb90: 75 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69  ure out the affi
cba0: 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63  nity to use to c
cbb0: 72 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d  reate a key from
cbc0: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
cbd0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70     ** of the exp
cbe0: 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
cbf0: 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
cc00: 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
cc10: 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a  able for.      *
cc20: 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P3 of OP_MakeR
cc30: 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ecord..      */.
cc40: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
cc50: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
cc60: 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20  ity(pExpr);..   
cc70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cc80: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
cc90: 72 2c 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20  r, 1, 0);..     
cca0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78   /* Code the <ex
ccb0: 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e  pr> from "<expr>
ccc0: 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20   IN (...)". The 
ccd0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
cce0: 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e        ** pExpr->
ccf0: 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  iTable contains 
cd00: 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20  the values that 
cd10: 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e  make up the (...
cd20: 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ) set..      */.
cd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cd40: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
cd50: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
cd60: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
cd70: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
cd80: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
cd90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cda0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
cdb0: 64 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20  ddr+4);         
cdc0: 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a     /* addr + 0 *
cdd0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
cde0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
cdf0: 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  op, 2, 0);.     
ce00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce10: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
ce20: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ce30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ce40: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b  P_Goto, 0, addr+
ce50: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
ce60: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
ce70: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
ce80: 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 20   &affinity, 1); 
ce90: 20 20 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f    /* addr + 4 */
cea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ceb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
cec0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
ced0: 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20  le, addr+7);.   
cee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cef0: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
cf00: 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20  , -1, 0);       
cf10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
cf20: 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20  dr + 6 */..     
cf30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
cf40: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
cf50: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
cf60: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
cf70: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
cf80: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
cf90: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
cfa0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
cfb0: 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
cfc0: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
cfd0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
cfe0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
cff0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
d000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d010: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
d020: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
d030: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d040: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
d050: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
d060: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
d070: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c  Right, OP_Ge, 0,
d080: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d090: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d0a0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
d0b0: 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
d0c0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
d0d0: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
d0e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d0f0: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
d100: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
d110: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
d120: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
d130: 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Le, 0, 0);.     
d140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d150: 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20  p(v, OP_And, 0, 
d160: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
d170: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d180: 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
d190: 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
d1a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d1b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
d1c0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62  >pLeft);.      b
d1d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d1e0: 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a  case TK_CASE: {.
d1f0: 20 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65        int expr_e
d200: 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20  nd_label;.      
d210: 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20  int jumpInst;.  
d220: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
d230: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20      int nExpr;. 
d240: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
d250: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d260: 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  st;.      struct
d270: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
d280: 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20  aListelem;..    
d290: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
d2a0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73  pList);.      as
d2b0: 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69  sert((pExpr->pLi
d2c0: 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d  st->nExpr % 2) =
d2d0: 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  = 0);.      asse
d2e0: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  rt(pExpr->pList-
d2f0: 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
d300: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
d310: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
d320: 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
d330: 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
d340: 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
d350: 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65  pr;.      expr_e
d360: 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74  nd_label = sqlit
d370: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d380: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  v);.      if( pE
d390: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
d3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d3b0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
d3c0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
d3d0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
d3e0: 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
d3f0: 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
d400: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d410: 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
d420: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d430: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
d440: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
d450: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d460: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31  (v, OP_Dup, 1, 1
d470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  );.          jum
d480: 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70  pInst = codeComp
d490: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
d4a0: 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74 65  r->pLeft, aListe
d4b0: 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20  lem[i].pExpr,.  
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f                 O
d4e0: 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  P_Ne, 0, 1);.   
d4f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d500: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
d510: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
d520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d530: 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71     jumpInst = sq
d540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d550: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30  , OP_IfNot, 1, 0
d560: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d570: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d580: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
d590: 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
d5a0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
d5b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d5c0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72  OP_Goto, 0, expr
d5d0: 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20  _end_label);.   
d5e0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
d5f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
d600: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
d610: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d620: 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20  P2(v, jumpInst, 
d630: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
d640: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
d650: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
d660: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d670: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
d680: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d690: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
d6a0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ght ){.        s
d6b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
d6c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
d6d0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ight);.      }el
d6e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d6f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d700: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a  OP_Null, 0, 0);.
d710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d720: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d730: 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e  Label(v, expr_en
d740: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
d750: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
d760: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d770: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73  _TRIGGER.    cas
d780: 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20  e TK_RAISE: {.  
d790: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
d7a0: 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
d7b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
d7c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61       "RAISE() ma
d7f0: 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
d800: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d  ithin a trigger-
d810: 70 72 6f 67 72 61 6d 22 29 3b 0a 09 72 65 74 75  program");..retu
d820: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
d830: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
d840: 6c 75 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20  lumn!=OE_Ignore 
d850: 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65  ){.         asse
d860: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
d870: 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  mn==OE_Rollback 
d880: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
d890: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
d8a0: 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c  mn == OE_Abort |
d8b0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
d8c0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
d8d0: 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a  n == OE_Fail );.
d8e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d8f0: 44 65 71 75 6f 74 65 45 78 70 72 28 70 45 78 70  DequoteExpr(pExp
d900: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c  r);.         sql
d910: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
d920: 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
d930: 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70 72  ONSTRAINT, pExpr
d940: 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->iColumn,.     
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
d970: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
d980: 6e 29 3b 0a 2f 2f 20 20 20 20 20 20 20 20 20 73  n);.//         s
d990: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
d9a0: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
d9b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
d9c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
d9d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
d9e0: 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
d9f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da00: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  ddOp(v, OP_Conte
da10: 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
da20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
da30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
da40: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
da50: 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
da60: 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
da70: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
da80: 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29  "# raise(IGNORE)
da90: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
daa0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
dab0: 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  eak;.  }.}..#ifn
dac0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dad0: 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65  TRIGGER./*.** Ge
dae0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
daf0: 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
db00: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
db10: 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65  nd leaves the re
db20: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  sult.** on the s
db30: 74 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20  tack.  See also 
db40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
db50: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
db60: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
db70: 20 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c   cache the resul
db80: 74 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  t and modify the
db90: 20 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73   pExpr tree.** s
dba0: 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d  o that it will m
dbb0: 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63  ake use of the c
dbc0: 61 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20  ached result on 
dbd0: 73 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75  subsequent evalu
dbe0: 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72  ations.** rather
dbf0: 20 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74   than evaluate t
dc00: 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73  he whole express
dc10: 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76  ion again.  Triv
dc20: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ial expressions 
dc30: 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65  are.** not cache
dc40: 64 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  d.  If the expre
dc50: 73 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c  ssion is cached,
dc60: 20 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73   its result is s
dc70: 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d  tored in a .** m
dc80: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
dc90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
dca0: 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
dcb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
dcc0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
dcd0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
dce0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
dcf0: 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  em;.  int addr1,
dd00: 20 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d   addr2;.  if( v=
dd10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
dd20: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
dd30: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
dd40: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
dd50: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
dd60: 72 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71  r);.  addr2 = sq
dd70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
dd80: 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61  Addr(v);.  if( a
dd90: 64 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20  ddr2>addr1+1 || 
dda0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
ddb0: 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f  (v, addr1)->opco
ddc0: 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  de==OP_Function 
ddd0: 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45  ){.    iMem = pE
dde0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
ddf0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
de00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de10: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
de20: 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  e, iMem, 0);.   
de30: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
de40: 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a  REGISTER;.  }.}.
de50: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
de60: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
de70: 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
de80: 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
de90: 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
dea0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
deb0: 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  st onto the stac
dec0: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
ded0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
dee0: 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e  ements pushed on
def0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f  to the stack..*/
df00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
df10: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
df20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
df30: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
df40: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
df50: 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a  ist *pList    /*
df60: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
df70: 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
df80: 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
df90: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
dfa0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
dfb0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
dfc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
dfd0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
dfe0: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
dff0: 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20 69 3e 30 3b  st->a, i=n; i>0;
e000: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
e010: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e020: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74 65  ode(pParse, pIte
e030: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  m->pExpr);.  }. 
e040: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
e050: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
e060: 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20  e for a boolean 
e070: 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20  expression such 
e080: 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d  that a jump is m
e090: 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61  ade.** to the la
e0a0: 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68  bel "dest" if th
e0b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e0c0: 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69  true but executi
e0d0: 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
e0e0: 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
e0f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e100: 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  is false..**.** 
e110: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
e120: 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  n evaluates to N
e130: 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75  ULL (neither tru
e140: 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68  e nor false), th
e150: 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a  en.** take the j
e160: 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49  ump if the jumpI
e170: 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74 72  fNull flag is tr
e180: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ue..**.** This c
e190: 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
e1a0: 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72  he fact that cer
e1b0: 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65  tain token value
e1c0: 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a  s (ex: TK_EQ).**
e1d0: 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
e1e0: 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28   opcode values (
e1f0: 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20  ex: OP_Eq) that 
e200: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
e210: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f  rresponding.** o
e220: 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69  peration.  Speci
e230: 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76  al comments in v
e240: 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b  dbe.c and the mk
e250: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69  opcodeh.awk scri
e260: 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b  pt in.** the mak
e270: 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20  e process cause 
e280: 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20  these values to 
e290: 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29  align.  Assert()
e2a0: 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a  s in the code.**
e2b0: 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68   below verify th
e2c0: 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61  at the numbers a
e2d0: 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65  re aligned corre
e2e0: 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ctly..*/.void sq
e2f0: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
e300: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
e310: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
e320: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
e330: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
e340: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e350: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
e360: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
e370: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
e380: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
e390: 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
e3a0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
e3b0: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
e3c0: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
e3d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e3e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
e3f0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
e400: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
e410: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20   !jumpIfNull);. 
e420: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e430: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
e440: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
e450: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
e460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e470: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
e480: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
e490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e4a0: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
e4b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
e4c0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
e4d0: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
e4e0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
e4f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
e500: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
e510: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
e520: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
e530: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e540: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
e550: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
e560: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
e570: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
e580: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
e590: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
e5a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e5b0: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
e5c0: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
e5d0: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
e5e0: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
e5f0: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
e600: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
e610: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
e620: 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20  =OP_Lt );.      
e630: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f  assert( TK_LE==O
e640: 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Le );.      as
e650: 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f  sert( TK_GT==OP_
e660: 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Gt );.      asse
e670: 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  rt( TK_GE==OP_Ge
e680: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e690: 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29  ( TK_EQ==OP_Eq )
e6a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e6b0: 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  TK_NE==OP_Ne );.
e6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e6d0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e6e0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
e6f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e700: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
e710: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
e720: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
e730: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e740: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
e750: 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , op, dest, jump
e760: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
e770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e780: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
e790: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
e7a0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
e7b0: 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
e7c0: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20  OP_IsNull );.   
e7d0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
e7e0: 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
e7f0: 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
e800: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e810: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
e820: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e830: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
e840: 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
e850: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e860: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
e870: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
e880: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42   expression "x B
e890: 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20  ETWEEN y AND z" 
e8a0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
e8b0: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
e8c0: 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79    ** 1 IF (x < y
e8d0: 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
e8e0: 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20  * 2 IF (x <= z) 
e8f0: 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
e900: 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20    ** 3 ....     
e910: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
e920: 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  dr;.      Expr *
e930: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
e940: 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
e950: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
e960: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
e970: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
e980: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e990: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
e9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e9b0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
e9c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
e9d0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e9e0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
e9f0: 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70   addr = codeComp
ea00: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
ea10: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74  t, pRight, OP_Lt
ea20: 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  , 0, !jumpIfNull
ea30: 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74  );..      pRight
ea40: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
ea50: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
ea60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ea70: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
ea80: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
ea90: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
eaa0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
eab0: 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  Le, dest, jumpIf
eac0: 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71  Null);..      sq
ead0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
eae0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
eaf0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
eb00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
eb10: 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33 56  , addr, sqlite3V
eb20: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
eb30: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
eb40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
eb50: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
eb60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
eb70: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
eb80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
eb90: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
eba0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
ebb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ebc0: 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  P_If, jumpIfNull
ebd0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
ebe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ebf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
ec00: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
ec10: 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
ec20: 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
ec30: 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
ec40: 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
ec50: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
ec60: 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
ec70: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
ec80: 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
ec90: 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
eca0: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
ecb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
ecc0: 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
ecd0: 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
ece0: 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
ecf0: 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
ed00: 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
ed10: 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  true or fall thr
ed20: 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
ed30: 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  ll is false..*/.
ed40: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
ed50: 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
ed60: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
ed70: 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
ed80: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
ed90: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
eda0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
edb0: 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d  op = 0;.  if( v=
edc0: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
edd0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
ede0: 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
edf0: 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
ee00: 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
ee10: 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
ee20: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
ee30: 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
ee40: 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
ee50: 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
ee60: 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
ee70: 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
ee80: 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
ee90: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
eea0: 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
eeb0: 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
eec0: 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
eed0: 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
eee0: 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
eef0: 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
ef00: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
ef20: 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
ef30: 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
ef40: 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
ef50: 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
ef60: 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
ef70: 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
ef80: 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
ef90: 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
efa0: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
efb0: 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
efc0: 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
efd0: 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
efe0: 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
eff0: 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
f000: 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
f010: 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
f020: 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
f030: 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
f040: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
f050: 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
f060: 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
f070: 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
f080: 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
f090: 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
f0a0: 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
f0b0: 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
f0c0: 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
f0d0: 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
f0e0: 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
f0f0: 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
f100: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f110: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
f120: 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
f130: 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
f140: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
f150: 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
f160: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
f170: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
f180: 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
f190: 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
f1a0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
f1b0: 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
f1c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
f1d0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
f1e0: 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
f1f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
f200: 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
f210: 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
f220: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
f230: 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
f240: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
f250: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
f260: 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
f270: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
f280: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
f290: 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
f2a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
f2b0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
f2c0: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
f2d0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
f2e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
f2f0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
f300: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
f310: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
f320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f330: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
f340: 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
f350: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
f360: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f370: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
f380: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
f390: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
f3a0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
f3b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
f3c0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
f3d0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
f3e0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
f3f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f400: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f410: 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
f420: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f430: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
f440: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
f450: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
f460: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
f470: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
f480: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f490: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
f4a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
f4b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
f4c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
f4d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
f4e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
f4f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f500: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f510: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
f520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f530: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
f540: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
f550: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
f560: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
f570: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
f580: 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75  ht, op, dest, ju
f590: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
f5a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f5b0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
f5c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
f5d0: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
f5e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f5f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
f600: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
f610: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f620: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
f630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f640: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
f650: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
f660: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
f670: 69 73 20 22 78 20 42 45 54 57 45 45 4e 20 79 20  is "x BETWEEN y 
f680: 41 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d  AND z". It is im
f690: 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20  plemented as:.  
f6a0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
f6b0: 31 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f  1 IF (x >= y) GO
f6c0: 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
f6d0: 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20  GOTO <dest>.    
f6e0: 20 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a    ** 3 IF (x > z
f6f0: 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20  ) GOTO <dest>.  
f700: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
f710: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70   addr;.      Exp
f720: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
f730: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
f740: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
f750: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
f760: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
f770: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f780: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
f790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f7a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
f7b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
f7c0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f7d0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
f7e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f7f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f800: 72 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  r(v);.      code
f810: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
f820: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
f830: 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a  P_Ge, addr+3, !j
f840: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20  umpIfNull);..   
f850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f860: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
f870: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f880: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f890: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
f8a0: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  );.      pRight 
f8b0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
f8c0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
f8d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f8e0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
f8f0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
f900: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
f910: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
f920: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
f930: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
f940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
f950: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
f960: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f970: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
f980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f990: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  ddOp(v, OP_IfNot
f9a0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
f9b0: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
f9c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
f9d0: 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
f9e0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
f9f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
fa00: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
fa10: 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66  (non-zero).** if
fa20: 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
fa30: 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46  cal and return F
fa40: 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66  ALSE if they dif
fa50: 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
fa60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
fa70: 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
fa80: 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
fa90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
faa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
fab0: 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65  n pB==0;.  }else
fac0: 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20   if( pB==0 ){.  
fad0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
fae0: 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
faf0: 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ->op ) return 0;
fb00: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
fb10: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
fb20: 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29  Left, pB->pLeft)
fb30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
fb40: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
fb50: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
fb60: 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
fb70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fb80: 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pA->pList ){.  
fb90: 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d    if( pB->pList=
fba0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fbb0: 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74     if( pA->pList
fbc0: 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69  ->nExpr!=pB->pLi
fbd0: 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  st->nExpr ) retu
fbe0: 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rn 0;.    for(i=
fbf0: 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e  0; i<pA->pList->
fc00: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
fc10: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
fc20: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
fc30: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
fc40: 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  , pB->pList->a[i
fc50: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
fc60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fc70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
fc80: 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73  lse if( pB->pLis
fc90: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
fca0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  0;.  }.  if( pA-
fcb0: 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e  >pSelect || pB->
fcc0: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
fcd0: 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54   0;.  if( pA->iT
fce0: 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
fcf0: 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21   || pA->iColumn!
fd00: 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
fd10: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
fd20: 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20  A->token.z ){.  
fd30: 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
fd40: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  z==0 ) return 0;
fd50: 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b  .    if( pB->tok
fd60: 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e  en.n!=pA->token.
fd70: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
fd80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
fd90: 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e  NICmp(pA->token.
fda0: 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  z, pB->token.z, 
fdb0: 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20  pB->token.n)!=0 
fdc0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
fdd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
fde0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
fdf0: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 50  lement to the pP
fe00: 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
fe10: 61 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74  ay and return it
fe20: 73 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 20  s index..** The 
fe30: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 69 73 20 69  new element is i
fe40: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
fe50: 72 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ro.  The calling
fe60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
fe70: 65 78 70 65 63 74 65 64 20 74 6f 20 66 69 6c 6c  expected to fill
fe80: 20 69 74 20 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   it in..*/.stati
fe90: 63 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67 49  c int appendAggI
fea0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
feb0: 65 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72 73  e){.  if( (pPars
fec0: 65 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d 3d  e->nAgg & 0x7)==
fed0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74  0 ){.    int amt
fee0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20   = pParse->nAgg 
fef0: 2b 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70 72  + 8;.    AggExpr
ff00: 20 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65 52   *aAgg = sqliteR
ff10: 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61  ealloc(pParse->a
ff20: 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28  Agg, amt*sizeof(
ff30: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29  pParse->aAgg[0])
ff40: 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67 3d  );.    if( aAgg=
ff50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
ff60: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
ff70: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20   pParse->aAgg = 
ff80: 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  aAgg;.  }.  mems
ff90: 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67 67  et(&pParse->aAgg
ffa0: 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20  [pParse->nAgg], 
ffb0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65  0, sizeof(pParse
ffc0: 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72  ->aAgg[0]));.  r
ffd0: 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41  eturn pParse->nA
ffe0: 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  gg++;.}../*.** T
fff0: 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63 20  his is an xFunc 
10000 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
10010 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  () used to imple
10020 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ment .** sqlite3
10030 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
10040 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
10050 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
10060 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
10070 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
10080 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
10090 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
100a0 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72 65 67  lyzes the aggreg
100b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  ate function at 
100c0 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pExpr..*/.static
100d0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
100e0 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72 67  egate(void *pArg
100f0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
10100 20 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45 78    int i;.  AggEx
10110 70 72 20 2a 61 41 67 67 3b 0a 20 20 4e 61 6d 65  pr *aAgg;.  Name
10120 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28  Context *pNC = (
10130 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70 41  NameContext *)pA
10140 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rg;.  Parse *pPa
10150 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
10160 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
10170 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
10180 72 63 4c 69 73 74 3b 0a 0a 20 20 73 77 69 74 63  rcList;..  switc
10190 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
101a0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
101b0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72 28  MN: {.      for(
101c0 69 3d 30 3b 20 70 53 72 63 4c 69 73 74 20 26 26  i=0; pSrcList &&
101d0 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
101e0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
101f0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
10200 6c 65 3d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 5b  le==pSrcList->a[
10210 69 5d 2e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  i].iCursor ){.  
10220 20 20 20 20 20 20 20 20 61 41 67 67 20 3d 20 70          aAgg = p
10230 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20  Parse->aAgg;.   
10240 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
10250 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
10260 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
10270 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73    if( aAgg[i].is
10280 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
10290 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
102a0 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69  aAgg[i].pExpr->i
102b0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
102c0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  able.           
102d0 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70 45 78    && aAgg[i].pEx
102e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pr->iColumn==pEx
102f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
10310 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
10320 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
10330 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
10340 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20  Parse->nAgg ){. 
10350 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61             i = a
10360 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
10370 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
10380 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
10390 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
103a0 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
103b0 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20 20 20  ].isAgg = 0;.   
103c0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
103d0 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
103e0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
103f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 45    }.          pE
10400 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
10410 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
10420 69 41 67 67 43 74 78 20 3d 20 70 4e 43 2d 3e 6e  iAggCtx = pNC->n
10430 44 65 70 74 68 3b 0a 20 20 20 20 20 20 20 20 20  Depth;.         
10440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
10450 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10460 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
10470 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
10480 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
10490 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44       if( pNC->nD
104a0 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  epth==0 ){.     
104b0 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65     aAgg = pParse
104c0 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 20 20  ->aAgg;.        
104d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
104e0 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
104f0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61 41           if( !aA
10500 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
10510 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
10520 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
10530 72 43 6f 6d 70 61 72 65 28 61 41 67 67 5b 69 5d  rCompare(aAgg[i]
10540 2e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29  .pExpr, pExpr) )
10550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
10560 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
10570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10580 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
10590 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20  ->nAgg ){.      
105a0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61      u8 enc = pPa
105b0 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20  rse->db->enc;.  
105c0 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
105d0 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
105e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
105f0 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b   i<0 ) return 1;
10600 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
10610 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
10620 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
10630 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
10640 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
10650 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
10660 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d  >aAgg[i].pFunc =
10670 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
10680 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
10690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
106a0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
106b0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a  pExpr->token.n,.
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
106d0 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45  Expr->pList ? pE
106e0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
106f0 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
10700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10710 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
10720 69 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  i;.        retur
10730 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
10740 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78   }.  }.  if( pEx
10750 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
10760 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b     pNC->nDepth++
10770 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63 74  ;.    walkSelect
10780 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65 6c  Expr(pExpr->pSel
10790 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72  ect, analyzeAggr
107a0 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20  egate, pNC);.   
107b0 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a   pNC->nDepth--;.
107c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
107d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
107e0 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
107f0 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ssion looking fo
10800 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
10810 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72  tions and.** for
10820 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20   variables that 
10830 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65 64  need to be added
10840 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
10850 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  aAgg[] array..**
10860 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c   Make additional
10870 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
10880 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
10890 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72  rray as necessar
108a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
108b0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
108c0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
108d0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
108e0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
108f0 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
10900 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
10910 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
10920 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
10930 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
10940 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
10950 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
10960 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
10970 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
10980 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
10990 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
109a0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
109b0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45  pExpr){.  int nE
109c0 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  rr = pNC->pParse
109d0 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78  ->nErr;.  walkEx
109e0 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e  prTree(pExpr, an
109f0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
10a00 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pNC);.  return p
10a10 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72  NC->pParse->nErr
10a20 20 2d 20 6e 45 72 72 3b 0a 7d 0a                  - nErr;.}.