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

Artifact bb2cf5d5b065eaa23d5ae2620f6de0568768147d:


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 33 30 20 32 30 30 35 2f 30 39 2f 32 33 20  .230 2005/09/23 
0220: 32 31 3a 31 31 3a 35 34 20 64 72 68 20 45 78 70  21:11:54 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 73 71  + 10;.        sq
2bf0: 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72  lite3ReallocOrFr
2c00: 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 50 61 72  ee((void**)&pPar
2c10: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20  se->apVarExpr,. 
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
2c40: 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65  arExprAlloc*size
2c50: 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  of(pParse->apVar
2c60: 45 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Expr[0]) );.    
2c70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
2c80: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
2c90: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
2ca0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
2cb0: 61 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a  apVarExpr!=0 );.
2cc0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2cd0: 61 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65  apVarExpr[pParse
2ce0: 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20  ->nVarExpr++] = 
2cf0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20  pExpr;.      }. 
2d00: 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a     }.  } .}../*.
2d10: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
2d20: 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73  elete an express
2d30: 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
2d40: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
2d50: 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ete(Expr *p){.  
2d60: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2d70: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e  n;.  if( p->span
2d80: 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65  .dyn ) sqliteFre
2d90: 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  e((char*)p->span
2da0: 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  .z);.  if( p->to
2db0: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
2dc0: 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  Free((char*)p->t
2dd0: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74  oken.z);.  sqlit
2de0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
2df0: 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  pLeft);.  sqlite
2e00: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2e10: 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65  Right);.  sqlite
2e20: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2e30: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  p->pList);.  sql
2e40: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
2e50: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
2e60: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
2e70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ../*.** The Expr
2e80: 2e 74 6f 6b 65 6e 20 66 69 65 6c 64 20 6d 69 67  .token field mig
2e90: 68 74 20 62 65 20 61 20 73 74 72 69 6e 67 20 6c  ht be a string l
2ea0: 69 74 65 72 61 6c 20 74 68 61 74 20 69 73 20 71  iteral that is q
2eb0: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 73 6f 2c  uoted..** If so,
2ec0: 20 72 65 6d 6f 76 65 20 74 68 65 20 71 75 6f 74   remove the quot
2ed0: 61 74 69 6f 6e 20 6d 61 72 6b 73 2e 0a 2a 2f 0a  ation marks..*/.
2ee0: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 71 75  void sqlite3Dequ
2ef0: 6f 74 65 45 78 70 72 28 45 78 70 72 20 2a 70 29  oteExpr(Expr *p)
2f00: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41  {.  if( ExprHasA
2f10: 6e 79 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  nyProperty(p, EP
2f20: 5f 44 65 71 75 6f 74 65 64 29 20 29 7b 0a 20 20  _Dequoted) ){.  
2f30: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2f40: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
2f50: 70 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 3b  p, EP_Dequoted);
2f60: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
2f70: 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dyn==0 ){.    sq
2f80: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
2f90: 70 2d 3e 74 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f  p->token, &p->to
2fa0: 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ken);.  }.  sqli
2fb0: 74 65 33 44 65 71 75 6f 74 65 28 28 63 68 61 72  te3Dequote((char
2fc0: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d  *)p->token.z);.}
2fd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
2fe0: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
2ff0: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
3000: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
3010: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
3020: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
3030: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
3040: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
3050: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
3060: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
3070: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
3080: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
3090: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
30a0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
30b0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
30c0: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
30d0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
30e0: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
30f0: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
3100: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
3110: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
3120: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
3130: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
3140: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
3150: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
3160: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
3170: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
3180: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
3190: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
31a0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
31b0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
31c0: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
31d0: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
31e0: 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ated..*/.Expr *s
31f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 45 78  qlite3ExprDup(Ex
3200: 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  pr *p){.  Expr *
3210: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
3220: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3230: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
3240: 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
3250: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
3260: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3270: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c   memcpy(pNew, p,
3280: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
3290: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
32a0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  z!=0 ){.    pNew
32b0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69  ->token.z = sqli
32c0: 74 65 53 74 72 4e 44 75 70 28 70 2d 3e 74 6f 6b  teStrNDup(p->tok
32d0: 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  en.z, p->token.n
32e0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  );.    pNew->tok
32f0: 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  en.dyn = 1;.  }e
3300: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
3310: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d   pNew->token.z==
3320: 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  0 );.  }.  pNew-
3330: 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70  >span.z = 0;.  p
3340: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
3350: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
3360: 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Left);.  pNew->p
3370: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
3380: 78 70 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74  xprDup(p->pRight
3390: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74  );.  pNew->pList
33a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
33b0: 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b  stDup(p->pList);
33c0: 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  .  pNew->pSelect
33d0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
33e0: 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  Dup(p->pSelect);
33f0: 0a 20 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20  .  pNew->pTab = 
3400: 70 2d 3e 70 54 61 62 3b 0a 20 20 72 65 74 75 72  p->pTab;.  retur
3410: 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73  n pNew;.}.void s
3420: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
3430: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65  Token *pTo, Toke
3440: 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  n *pFrom){.  if(
3450: 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69   pTo->dyn ) sqli
3460: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54  teFree((char*)pT
3470: 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72  o->z);.  if( pFr
3480: 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f  om->z ){.    pTo
3490: 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a  ->n = pFrom->n;.
34a0: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73 71 6c      pTo->z = sql
34b0: 69 74 65 53 74 72 4e 44 75 70 28 70 46 72 6f 6d  iteStrNDup(pFrom
34c0: 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a  ->z, pFrom->n);.
34d0: 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31      pTo->dyn = 1
34e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
34f0: 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d  To->z = 0;.  }.}
3500: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
3510: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45 78  e3ExprListDup(Ex
3520: 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78  prList *p){.  Ex
3530: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
3540: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
3550: 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f  item *pItem, *pO
3560: 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  ldItem;.  int i;
3570: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
3580: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
3590: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
35a0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
35b0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
35c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
35d0: 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e  ->nExpr = pNew->
35e0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70  nAlloc = p->nExp
35f0: 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70  r;.  pNew->a = p
3600: 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Item = sqliteMal
3610: 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73 69  loc( p->nExpr*si
3620: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
3630: 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20  .  if( pItem==0 
3640: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
3650: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  e(pNew);.    ret
3660: 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f  urn 0;.  } .  pO
3670: 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20  ldItem = p->a;. 
3680: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
3690: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
36a0: 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b  ++, pOldItem++){
36b0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
36c0: 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a  xpr, *pOldExpr;.
36d0: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
36e0: 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71   = pNewExpr = sq
36f0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c  lite3ExprDup(pOl
3700: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
3710: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ->pExpr);.    if
3720: 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  ( pOldExpr->span
3730: 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70  .z!=0 && pNewExp
3740: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  r ){.      /* Al
3750: 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79  ways make a copy
3760: 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72   of the span for
3770: 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65   top-level expre
3780: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20  ssions in the.  
3790: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
37a0: 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67  n list.  The log
37b0: 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f  ic in SELECT pro
37c0: 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74  cessing that det
37d0: 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  ermines.      **
37e0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
37f0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
3800: 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68  ult set needs th
3810: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  is information *
3820: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
3830: 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45 78  okenCopy(&pNewEx
3840: 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45  pr->span, &pOldE
3850: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
3860: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  }.    assert( pN
3870: 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65  ewExpr==0 || pNe
3880: 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30  wExpr->span.z!=0
3890: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
38a0: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
38b0: 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  z==0 || sqlite3_
38c0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 3b  malloc_failed );
38d0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
38e0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
38f0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
3900: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
3910: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
3920: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
3930: 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20     pItem->isAgg 
3940: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67  = pOldItem->isAg
3950: 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  g;.    pItem->do
3960: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ne = 0;.  }.  re
3970: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
3980: 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20  .** If cursors, 
3990: 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20  triggers, views 
39a0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61  and subqueries a
39b0: 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66  re all omitted f
39c0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64  rom.** the build
39d0: 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74  , then none of t
39e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
39f0: 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f  tines, except fo
3a00: 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  r .** sqlite3Sel
3a10: 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65  ectDup(), can be
3a20: 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33   called. sqlite3
3a30: 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73  SelectDup() is s
3a40: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c  ometimes.** call
3a50: 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61  ed with a NULL a
3a60: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
3a70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3a80: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
3a90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3aa0: 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c  IT_TRIGGER) \. |
3ab0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
3ad0: 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
3ae0: 33 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c  3SrcListDup(SrcL
3af0: 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ist *p){.  SrcLi
3b00: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
3b10: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  i;.  int nByte;.
3b20: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3b30: 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d  urn 0;.  nByte =
3b40: 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70   sizeof(*p) + (p
3b50: 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f  ->nSrc>0 ? sizeo
3b60: 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d  f(p->a[0]) * (p-
3b70: 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20  >nSrc-1) : 0);. 
3b80: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3b90: 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29  llocRaw( nByte )
3ba0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3bb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3bc0: 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d  ew->nSrc = pNew-
3bd0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72  >nAlloc = p->nSr
3be0: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
3bf0: 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  p->nSrc; i++){. 
3c00: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
3c10: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
3c20: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
3c30: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
3c40: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
3c50: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
3c60: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
3c70: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61     pNewItem->zDa
3c80: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53  tabase = sqliteS
3c90: 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  trDup(pOldItem->
3ca0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
3cb0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
3cc0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3cd0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
3ce0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
3cf0: 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74  Alias = sqliteSt
3d00: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
3d10: 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77  Alias);.    pNew
3d20: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d  Item->jointype =
3d30: 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pOldItem->joint
3d40: 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ype;.    pNewIte
3d50: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
3d60: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
3d70: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
3d80: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
3d90: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
3da0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
3db0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
3dc0: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
3dd0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
3de0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
3df0: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
3e00: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3e10: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
3e20: 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  prDup(pOldItem->
3e30: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
3e40: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
3e50: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f  ite3IdListDup(pO
3e60: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
3e70: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
3e80: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
3e90: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
3ea0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3eb0: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
3ec0: 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74  IdListDup(IdList
3ed0: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
3ee0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
3ef0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3f00: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3f10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3f20: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
3f30: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3f40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3f50: 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e  w->nId = pNew->n
3f60: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a  Alloc = p->nId;.
3f70: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
3f80: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e  teMallocRaw( p->
3f90: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
3fa0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
3fb0: 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73  w->a==0 ){.    s
3fc0: 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b  qliteFree(pNew);
3fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3fe0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
3ff0: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
4000: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
4010: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
4020: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
4030: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
4040: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
4050: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
4060: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
4070: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
4080: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
4090: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
40a0: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
40b0: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
40c0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
40d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
40e0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
40f0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
4100: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
4110: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
4120: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
4130: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
4140: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
4150: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  rn 0;.  pNew->is
4160: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
4170: 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77  Distinct;.  pNew
4180: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
4190: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
41a0: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  >pEList);.  pNew
41b0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
41c0: 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53  SrcListDup(p->pS
41d0: 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  rc);.  pNew->pWh
41e0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
41f0: 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b  rDup(p->pWhere);
4200: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
4210: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
4220: 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75 70  istDup(p->pGroup
4230: 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  By);.  pNew->pHa
4240: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
4250: 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e 67  prDup(p->pHaving
4260: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
4270: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
4280: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72 64  rListDup(p->pOrd
4290: 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  erBy);.  pNew->o
42a0: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65  p = p->op;.  pNe
42b0: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69  w->pPrior = sqli
42c0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  te3SelectDup(p->
42d0: 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d  pPrior);.  pNew-
42e0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
42f0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69 6d  3ExprDup(p->pLim
4300: 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  it);.  pNew->pOf
4310: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
4320: 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65 74  prDup(p->pOffset
4330: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
4340: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
4350: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
4360: 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64  pNew->isResolved
4370: 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64   = p->isResolved
4380: 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20  ;.  pNew->isAgg 
4390: 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 70 4e  = p->isAgg;.  pN
43a0: 65 77 2d 3e 75 73 65 73 56 69 72 74 20 3d 20 30  ew->usesVirt = 0
43b0: 3b 0a 20 20 70 4e 65 77 2d 3e 64 69 73 61 6c 6c  ;.  pNew->disall
43c0: 6f 77 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  owOrderBy = 0;. 
43d0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
43e0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 61  t = 0;.  pNew->a
43f0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d  ddrOpenVirt[0] =
4400: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
4410: 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d 20 2d  rOpenVirt[1] = -
4420: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
4430: 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b  penVirt[2] = -1;
4440: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
4450: 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a  }.#else.Select *
4460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4470: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61  (Select *p){.  a
4480: 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
4490: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
44a0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
44b0: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
44c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65   the end of an e
44d0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
44e0: 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20   If pList is.** 
44f0: 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20  initially NULL, 
4500: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
4510: 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  w expression lis
4520: 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a  t..*/.ExprList *
4530: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
4540: 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a  ppend(ExprList *
4550: 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78  pList, Expr *pEx
4560: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  pr, Token *pName
4570: 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ){.  if( pList==
4580: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
4590: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
45a0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
45b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
45c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
45d0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
45e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
45f0: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  t->nAlloc==0 );.
4600: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
4610: 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e  >nAlloc<=pList->
4620: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72  nExpr ){.    str
4630: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4640: 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20  m *a;.    int n 
4650: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
4660: 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73  2 + 4;.    a = s
4670: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
4680: 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28  st->a, n*sizeof(
4690: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
46a0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
46b0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
46c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
46d0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c  t->a = a;.    pL
46e0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b  ist->nAlloc = n;
46f0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4700: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
4710: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
4720: 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  me ){.    struct
4730: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
4740: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
4750: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
4760: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
4770: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
4780: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
4790: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
47a0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
47b0: 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  (pName);.    pIt
47c0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
47d0: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
47e0: 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20  pList;..no_mem: 
47f0: 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20      .  /* Avoid 
4800: 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69  leaking memory i
4810: 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69  f malloc has fai
4820: 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  led. */.  sqlite
4830: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
4840: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
4850: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
4860: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
4870: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
4880: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
4890: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
48a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
48b0: 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73  stDelete(ExprLis
48c0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
48d0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70   i;.  struct Exp
48e0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
48f0: 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
4900: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
4910: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
4920: 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78  0 || (pList->nEx
4930: 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e  pr==0 && pList->
4940: 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20  nAlloc==0) );.  
4950: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
4960: 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr<=pList->nAl
4970: 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  loc );.  for(pIt
4980: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
4990: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
49a0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
49b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
49c0: 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45  Delete(pItem->pE
49d0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
49e0: 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Free(pItem->zNam
49f0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
4a00: 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
4a10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
4a20: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  st);.}../*.** Wa
4a30: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
4a40: 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78 46 75   tree.  Call xFu
4a50: 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65  nc for each node
4a60: 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   visited..**.** 
4a70: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
4a80: 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65 74 65   from xFunc dete
4a90: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 74  rmines whether t
4aa0: 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e  he tree walk con
4ab0: 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61  tinues..** 0 mea
4ac0: 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b  ns continue walk
4ad0: 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20 20 31  ing the tree.  1
4ae0: 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61   means do not wa
4af0: 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f  lk children.** o
4b00: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f  f the current no
4b10: 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  de but continue 
4b20: 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e 20 20  with siblings.  
4b30: 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a  2 means abandon.
4b40: 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  ** the tree walk
4b50: 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a   completely..**.
4b60: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
4b70: 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f  lue from this ro
4b80: 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20 61 62  utine is 1 to ab
4b90: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
4ba0: 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20  alk.** and 0 to 
4bb0: 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
4bc0: 4e 4f 54 49 43 45 3a 20 20 54 68 69 73 20 72 6f  NOTICE:  This ro
4bd0: 75 74 69 6e 65 20 64 6f 65 73 20 2a 6e 6f 74 2a  utine does *not*
4be0: 20 64 65 73 63 65 6e 64 20 69 6e 74 6f 20 73 75   descend into su
4bf0: 62 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 73 74 61  bqueries..*/.sta
4c00: 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72  tic int walkExpr
4c10: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 2c  List(ExprList *,
4c20: 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c   int (*)(void *,
4c30: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29   Expr*), void *)
4c40: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  ;.static int wal
4c50: 6b 45 78 70 72 54 72 65 65 28 45 78 70 72 20 2a  kExprTree(Expr *
4c60: 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75  pExpr, int (*xFu
4c70: 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29  nc)(void*,Expr*)
4c80: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
4c90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
4ca0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
4cb0: 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75   0;.  rc = (*xFu
4cc0: 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72 29  nc)(pArg, pExpr)
4cd0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
4ce0: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4cf0: 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65  rTree(pExpr->pLe
4d00: 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ft, xFunc, pArg)
4d10: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
4d20: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
4d30: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  e(pExpr->pRight,
4d40: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
4d50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
4d60: 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  ( walkExprList(p
4d70: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75  Expr->pList, xFu
4d80: 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75  nc, pArg) ) retu
4d90: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
4da0: 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn rc>1;.}../*.*
4db0: 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54  * Call walkExprT
4dc0: 72 65 65 28 29 20 66 6f 72 20 65 76 65 72 79 20  ree() for every 
4dd0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69  expression in li
4de0: 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  st p..*/.static 
4df0: 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  int walkExprList
4e00: 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e  (ExprList *p, in
4e10: 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20  t (*xFunc)(void 
4e20: 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  *, Expr*), void 
4e30: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b  *pArg){.  int i;
4e40: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
4e50: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
4e60: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
4e70: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  n 0;.  for(i=p->
4e80: 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
4e90: 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
4ea0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 77  em++){.    if( w
4eb0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74 65  alkExprTree(pIte
4ec0: 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c  m->pExpr, xFunc,
4ed0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4ee0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4ef0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  0;.}../*.** Call
4f00: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
4f10: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
4f20: 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 70  sion in Select p
4f30: 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a  , not including.
4f40: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
4f50: 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20  hat are part of 
4f60: 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 61  sub-selects in a
4f70: 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ny FROM clause o
4f80: 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f  r the LIMIT.** o
4f90: 72 20 4f 46 46 53 45 54 20 65 78 70 72 65 73 73  r OFFSET express
4fa0: 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ions...*/.static
4fb0: 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74 45   int walkSelectE
4fc0: 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  xpr(Select *p, i
4fd0: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
4fe0: 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64   *, Expr*), void
4ff0: 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45   *pArg){.  walkE
5000: 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73  xprList(p->pELis
5010: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  t, xFunc, pArg);
5020: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
5030: 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75 6e 63  p->pWhere, xFunc
5040: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
5050: 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
5060: 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  pBy, xFunc, pArg
5070: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  );.  walkExprTre
5080: 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46  e(p->pHaving, xF
5090: 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61  unc, pArg);.  wa
50a0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  lkExprList(p->pO
50b0: 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c 20 70  rderBy, xFunc, p
50c0: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
50d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
50e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
50f0: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
5100: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
5110: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20  e()..**.** pArg 
5120: 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e  is really a poin
5130: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
5140: 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74 65  r.  If we can te
5150: 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  ll by looking.**
5160: 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20 74   at pExpr that t
5170: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
5180: 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78 70  at contains pExp
5190: 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74  r is not a const
51a0: 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ant.** expressio
51b0: 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41 72  n, then set *pAr
51c0: 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  g to 0 and retur
51d0: 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  n 2 to abandon t
51e0: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
51f0: 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20 64   If pExpr does d
5200: 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c 69  oes not disquali
5210: 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
5220: 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20 63  n from being a c
5230: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20  onstant.** then 
5240: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  do nothing..**.*
5250: 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67 20  * After walking 
5260: 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c 20  the whole tree, 
5270: 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20  if no nodes are 
5280: 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71 75  found that disqu
5290: 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78 70  alify.** the exp
52a0: 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74  ression as const
52b0: 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73 73  ant, then we ass
52c0: 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78  ume the whole ex
52d0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63  pression.** is c
52e0: 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73 71  onstant.  See sq
52f0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
5300: 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  ant() for additi
5310: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
5320: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5330: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
5340: 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  nt(void *pArg, E
5350: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
5360: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
5370: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69   ){.    /* Consi
5380: 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  der functions to
5390: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20   be constant if 
53a0: 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65  all their argume
53b0: 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  nts are constant
53c0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70 41 72  .    ** and *pAr
53d0: 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61 73 65  g==2 */.    case
53e0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
53f0: 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74 2a 29      if( *((int*)
5400: 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74 75 72  pArg)==2 ) retur
5410: 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  n 0;.      /* Fa
5420: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
5430: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
5440: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
5450: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
5460: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  T:.    case TK_A
5470: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
5480: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
5490: 55 4d 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c  UMN:.#ifndef SQL
54a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
54b0: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
54c0: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
54d0: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
54e0: 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70  .      *((int*)p
54f0: 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  Arg) = 0;.      
5500: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 63 61  return 2;.    ca
5510: 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20  se TK_IN:.      
5520: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
5530: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  ct ){.        *(
5540: 28 69 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b  (int*)pArg) = 0;
5550: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5560: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 64  2;.      }.    d
5570: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
5580: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
5590: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
55a0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
55b0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
55c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
55d0: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
55e0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
55f0: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
5600: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
5610: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
5620: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
5630: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
5640: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
5650: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
5660: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
5670: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
5680: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
5690: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
56a0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
56b0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
56c0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
56d0: 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74  ){.  int isConst
56e0: 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72   = 1;.  walkExpr
56f0: 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65  Tree(p, exprNode
5700: 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43  IsConstant, &isC
5710: 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  onst);.  return 
5720: 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  isConst;.}../*.*
5730: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
5740: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
5750: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
5760: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
5770: 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74  nt.** or a funct
5780: 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f  ion call with co
5790: 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73  nstant arguments
57a0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20  .  Return and 0 
57b0: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
57c0: 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  any variables..*
57d0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
57e0: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
57f0: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
5800: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
5810: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
5820: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
5830: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
5840: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
5850: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
5860: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
5870: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
5880: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
5890: 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b  nction(Expr *p){
58a0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
58b0: 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   2;.  walkExprTr
58c0: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
58d0: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
58e0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
58f0: 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Const!=0;.}../*.
5900: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
5910: 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63  sion p codes a c
5920: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
5930: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
5940: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
5950: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
5960: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
5970: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
5980: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
5990: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
59a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
59b0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
59c0: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
59d0: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
59e0: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
59f0: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
5a00: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
5a10: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
5a20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5a30: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
5a40: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
5a50: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
5a60: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
5a70: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
5a80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5a90: 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65  GetInt32(p->toke
5aa0: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a  n.z, pValue) ){.
5ab0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
5ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ad0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5ae0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
5af0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
5b00: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
5b10: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
5b20: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alue);.    }.   
5b30: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
5b40: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
5b50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5b60: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
5b70: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
5b80: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
5b90: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65  = -v;.        re
5ba0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
5bb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5bc0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
5bd0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5be0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5bf0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
5c00: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
5c10: 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
5c20: 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
5c30: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
5c40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
5c50: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5c60: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
5c70: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
5c80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
5c90: 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
5ca0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
5cb0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
5cc0: 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
5cd0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
5ce0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5cf0: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
5d00: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f  me of a column o
5d10: 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a  f the form X.Y.Z
5d20: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
5d30: 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68  Z, look up.** th
5d40: 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  at name in the s
5d50: 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62  et of source tab
5d60: 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  les in pSrcList 
5d70: 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78  and make the pEx
5d80: 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  pr .** expressio
5d90: 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63  n node refer bac
5da0: 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65  k to that source
5db0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f   column.  The fo
5dc0: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a  llowing changes.
5dd0: 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70  ** are made to p
5de0: 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  Expr:.**.**    p
5df0: 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20  Expr->iDb       
5e00: 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65      Set the inde
5e10: 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f  x in db->aDb[] o
5e20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
5e30: 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  olding.**       
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20    the table..** 
5e60: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
5e70: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74          Set to t
5e80: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
5e90: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f   for the table o
5ea0: 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20  btained.**      
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74     from pSrcList
5ed0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
5ee0: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74  Column       Set
5ef0: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
5f00: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65  umber within the
5f10: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
5f20: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
5f30: 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c     Set to TK_COL
5f40: 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  UMN..**    pExpr
5f50: 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20  ->pLeft         
5f60: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
5f70: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
5f80: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70   deleted.**    p
5f90: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20  Expr->pRight    
5fa0: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
5fb0: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
5fc0: 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  o is deleted..**
5fd0: 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e  .** The pDbToken
5fe0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
5ff0: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68  the database (th
6000: 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61  e "X").  This va
6010: 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55  lue may be.** NU
6020: 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  LL meaning that 
6030: 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66  name is of the f
6040: 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41  orm Y.Z or Z.  A
6050: 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74  ny available dat
6060: 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20  abase.** can be 
6070: 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c  used.  The pTabl
6080: 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  eToken is the na
6090: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
60a0: 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69 73  (the "Y").  This
60b0: 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65  .** value can be
60c0: 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65   NULL if pDbToke
60d0: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20  n is also NULL. 
60e0: 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20   If pTableToken 
60f0: 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65  is NULL it.** me
6100: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72  ans that the for
6110: 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73  m of the name is
6120: 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   Z and that colu
6130: 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62  mns from any tab
6140: 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  le.** can be use
6150: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
6160: 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  name cannot be r
6170: 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75  esolved unambigu
6180: 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20  ously, leave an 
6190: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
61a0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
61b0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  eturn non-zero. 
61c0: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
61d0: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
61e0: 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d  ic int lookupNam
61f0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
6200: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
6210: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
6220: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54  */.  Token *pDbT
6230: 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  oken,     /* Nam
6240: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6250: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
6260: 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  le, or NULL */. 
6270: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f   Token *pTableTo
6280: 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ken,  /* Name of
6290: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
62a0: 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c  g column, or NUL
62b0: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  L */.  Token *pC
62c0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e  olumnToken, /* N
62d0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
62e0: 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  n. */.  NameCont
62f0: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20  ext *pNC,    /* 
6300: 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  The name context
6310: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
6320: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45   the name */.  E
6330: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
6340: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73      /* Make this
6350: 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74   EXPR node point
6360: 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64   to the selected
6370: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20   column */.){.  
6380: 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20  char *zDb = 0;  
6390: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
63a0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
63b0: 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20  he "X" in X.Y.Z 
63c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20  */.  char *zTab 
63d0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
63e0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  e of the table. 
63f0: 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e   The "Y" in X.Y.
6400: 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68  Z or Y.Z */.  ch
6410: 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20  ar *zCol = 0;   
6420: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6430: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22  e column.  The "
6440: 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  Z" */.  int i, j
6450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6460: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
6470: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20  .  int cnt = 0; 
6480: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6490: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
64a0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
64b0: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
64c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
64d0: 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  f matching table
64e0: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69   names */.  sqli
64f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6500: 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61  ->db;  /* The da
6510: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75  tabase */.  stru
6520: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
6530: 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a  *pItem;       /*
6540: 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67   Use for looping
6550: 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 69   over pSrcList i
6560: 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  tems */.  struct
6570: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
6580: 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54  Match = 0;  /* T
6590: 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63  he matching pSrc
65a0: 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e  List item */.  N
65b0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70  ameContext *pTop
65c0: 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20  NC = pNC;       
65d0: 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f   /* First nameco
65e0: 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73  ntext in the lis
65f0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
6600: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20  pColumnToken && 
6610: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20  pColumnToken->z 
6620: 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58  ); /* The Z in X
6630: 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e  .Y.Z cannot be N
6640: 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73  ULL */.  zDb = s
6650: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6660: 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20  ken(pDbToken);. 
6670: 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e   zTab = sqlite3N
6680: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
6690: 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f  bleToken);.  zCo
66a0: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
66b0: 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e  romToken(pColumn
66c0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71  Token);.  if( sq
66d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
66e0: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
66f0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a  lookupname_end;.
6700: 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54    }..  pExpr->iT
6710: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69  able = -1;.  whi
6720: 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d  le( pNC && cnt==
6730: 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  0 ){.    SrcList
6740: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
6750: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
6760: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
6770: 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 0a   = pNC->pEList;.
6780: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
6790: 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73  zTab==0 || pELis
67a0: 74 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69  t==0 ); */.    i
67b0: 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
67c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49       for(i=0, pI
67d0: 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b  tem=pSrcList->a;
67e0: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
67f0: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
6800: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
6810: 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
6820: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  Tab;.        Col
6830: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20  umn *pCol;.  .  
6840: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
6850: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
6860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
6870: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
6880: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29        if( zTab )
6890: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
68a0: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
68b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
68c0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
68d0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
68e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
68f0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62  ite3StrICmp(zTab
6900: 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29  Name, zTab)!=0 )
6910: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6920: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6930: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
6940: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
6950: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
6960: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
6970: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
6980: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
6990: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
69a0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
69b0: 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c  f( zDb!=0 && sql
69c0: 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e  ite3StrICmp(db->
69d0: 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a  aDb[pTab->iDb].z
69e0: 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b  Name, zDb)!=0 ){
69f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
6a00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
6a10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6a20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
6a30: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74       if( 0==(cnt
6a40: 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  Tab++) ){.      
6a50: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6a60: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
6a70: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  or;.          pE
6a80: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
6a90: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20  >iDb;.          
6aa0: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
6ab0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ac0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
6ad0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
6ae0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
6af0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
6b00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6b10: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
6b20: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
6b30: 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74            IdList
6b40: 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20   *pUsing;.      
6b50: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
6b60: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6b70: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
6b80: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
6b90: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
6ba0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tem;.           
6bb0: 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54   pExpr->iDb = pT
6bc0: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20  ab->iDb;.       
6bd0: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
6be0: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
6bf0: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
6c00: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
6c10: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
6c20: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
6c30: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
6c40: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
6c50: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6c60: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
6c70: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
6c80: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
6c90: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
6ca0: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
6cb0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
6cc0: 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  if( pItem->joint
6cd0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
6ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6cf0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74    /* If this mat
6d00: 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74  ch occurred in t
6d10: 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
6d20: 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c   a natural join,
6d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
6d40: 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  * then skip the 
6d50: 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20 61  right table to a
6d60: 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65  void a duplicate
6d70: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
6d80: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b          pItem++;
6d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
6da0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
6db0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
6dc0: 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65  ( (pUsing = pIte
6dd0: 6d 2d 3e 70 55 73 69 6e 67 29 21 3d 30 20 29 7b  m->pUsing)!=0 ){
6de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
6df0: 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20  * If this match 
6e00: 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75  occurs on a colu
6e10: 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  mn that is in th
6e20: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20  e USING clause. 
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
6e40: 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20  of a join, skip 
6e50: 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74 68  the search of th
6e60: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
6e70: 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20   the join.      
6e80: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76          ** to av
6e90: 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20  oid a duplicate 
6ea0: 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a  match there. */.
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
6ec0: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
6ed0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55     for(k=0; k<pU
6ee0: 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b  sing->nId; k++){
6ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6f00: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6f10: 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d  Cmp(pUsing->a[k]
6f20: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
6f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f40: 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20        pItem++;. 
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f60: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
6f70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
6fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6fb0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
6fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6fe0: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
6ff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
7000: 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  ER.    /* If we 
7010: 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79  have not already
7020: 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61   resolved the na
7030: 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a  me, then maybe .
7040: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e      ** it is a n
7050: 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72  ew.* or old.* tr
7060: 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72  igger argument r
7070: 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a  eference.    */.
7080: 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26      if( zDb==0 &
7090: 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74  & zTab!=0 && cnt
70a0: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74  ==0 && pParse->t
70b0: 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20  rigStack!=0 ){. 
70c0: 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61 63       TriggerStac
70d0: 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b  k *pTriggerStack
70e0: 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53   = pParse->trigS
70f0: 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c  tack;.      Tabl
7100: 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  e *pTab = 0;.   
7110: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53     if( pTriggerS
7120: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20  tack->newIdx != 
7130: 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  -1 && sqlite3Str
7140: 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62  ICmp("new", zTab
7150: 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
7160: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
7170: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
7180: 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20  >newIdx;.       
7190: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
71a0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a  rStack->pTab );.
71b0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
71c0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
71d0: 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ab;.      }else 
71e0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
71f0: 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20  k->oldIdx != -1 
7200: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
7210: 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d  p("old", zTab)==
7220: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
7230: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72  pr->iTable = pTr
7240: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
7250: 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  dx;.        asse
7260: 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63  rt( pTriggerStac
7270: 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20  k->pTab );.     
7280: 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67     pTab = pTrigg
7290: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20  erStack->pTab;. 
72a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
72b0: 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20  ( pTab ){ .     
72c0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
72d0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
72e0: 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20   pTab->aCol;..  
72f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62        pExpr->iDb
7300: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
7310: 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a        cntTab++;.
7320: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7330: 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b   j < pTab->nCol;
7340: 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a   j++, pCol++) {.
7350: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
7360: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
7370: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  l->zName, zCol)=
7380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7390: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
73a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
73b0: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
73c0: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
73d0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
73e0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
73f0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
7400: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
7410: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
7420: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
7430: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
7440: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
7450: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
7460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7470: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
7480: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
7490: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
74a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
74b0: 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  ER) */..    /*. 
74c0: 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68     ** Perhaps th
74d0: 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65  e name is a refe
74e0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57  rence to the ROW
74f0: 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ID.    */.    if
7500: 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54  ( cnt==0 && cntT
7510: 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  ab==1 && sqlite3
7520: 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b  IsRowid(zCol) ){
7530: 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a  .      cnt = 1;.
7540: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
7550: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
7560: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
7570: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
7580: 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  TEGER;.    }..  
7590: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    /*.    ** If t
75a0: 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74  he input is of t
75b0: 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59  he form Z (not Y
75c0: 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65  .Z or X.Y.Z) the
75d0: 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20  n the name Z.   
75e0: 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20   ** might refer 
75f0: 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74  to an result-set
7600: 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61   alias.  This ha
7610: 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
7620: 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  le, when.    ** 
7630: 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67  we are resolving
7640: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48   names in the WH
7650: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
7660: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d  e following comm
7670: 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  and:.    **.    
7680: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
7690: 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c  b AS x FROM tabl
76a0: 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20  e WHERE x<10;.  
76b0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63    **.    ** In c
76c0: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20  ases like this, 
76d0: 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69  replace pExpr wi
76e0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
76f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
7700: 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68  .    ** forms th
7710: 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74  e result set ent
7720: 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65  ry ("a+b" in the
7730: 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65   example) and re
7740: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
7750: 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  ..    ** Note th
7760: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
7770: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
7780: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
7790: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20  already been.   
77a0: 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20   ** resolved by 
77b0: 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48 45  the time the WHE
77c0: 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65 73  RE clause is res
77d0: 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  olved..    */.  
77e0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
77f0: 70 45 4c 69 73 74 21 3d 30 20 26 26 20 7a 54 61  pEList!=0 && zTa
7800: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  b==0 ){.      fo
7810: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
7820: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
7830: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
7840: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  = pEList->a[j].z
7850: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
7860: 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69  ( zAs!=0 && sqli
7870: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20  te3StrICmp(zAs, 
7880: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
7890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
78a0: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
78b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
78c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
78d0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53  Expr->op = TK_AS
78e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
78f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a  r->iColumn = j;.
7900: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7910: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
7920: 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
7930: 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
7940: 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a         cnt = 1;.
7950: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
7960: 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62  ( zTab==0 && zDb
7970: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
7980: 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65   goto lookupname
7990: 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20 20  _end_2;.        
79a0: 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d  }.      } .    }
79b0: 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  ..    /* Advance
79c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d   to the next nam
79d0: 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20  e context.  The 
79e0: 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77  loop will exit w
79f0: 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a  hen either.    *
7a00: 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74 63  * we have a matc
7a10: 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65  h (cnt>0) or whe
7a20: 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  n we run out of 
7a30: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20  name contexts.. 
7a40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
7a50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  t==0 ){.      pN
7a60: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
7a70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
7a80: 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20    ** If X and Y 
7a90: 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68  are NULL (in oth
7aa0: 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79  er words if only
7ab0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
7ac0: 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c   Z is.  ** suppl
7ad0: 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c  ied) and the val
7ae0: 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f  ue of Z is enclo
7af0: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75  sed in double-qu
7b00: 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  otes, then.  ** 
7b10: 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69  Z is a string li
7b20: 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73  teral if it does
7b30: 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  n't match any co
7b40: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20  lumn names.  In 
7b50: 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20  that.  ** case, 
7b60: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72  we need to retur
7b70: 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64  n right away and
7b80: 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68   not make any ch
7b90: 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45  anges to.  ** pE
7ba0: 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  xpr..  **.  ** B
7bb0: 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65  ecause no refere
7bc0: 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20  nce was made to 
7bd0: 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20  outer contexts, 
7be0: 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20  the pNC->nRef.  
7bf0: 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f  ** fields are no
7c00: 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79  t changed in any
7c10: 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20   context..  */. 
7c20: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a   if( cnt==0 && z
7c30: 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d  Tab==0 && pColum
7c40: 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22  nToken->z[0]=='"
7c50: 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ' ){.    sqliteF
7c60: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72  ree(zCol);.    r
7c70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7c80: 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d  /*.  ** cnt==0 m
7c90: 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e  eans there was n
7ca0: 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31  ot match.  cnt>1
7cb0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72   means there wer
7cc0: 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f  e two or.  ** mo
7cd0: 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74  re matches.  Eit
7ce0: 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65  her way, we have
7cf0: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a   an error..  */.
7d00: 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a    if( cnt!=1 ){.
7d10: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b      char *z = 0;
7d20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  .    char *zErr;
7d30: 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d  .    zErr = cnt=
7d40: 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f  =0 ? "no such co
7d50: 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62  lumn: %s" : "amb
7d60: 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61  iguous column na
7d70: 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28  me: %s";.    if(
7d80: 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71   zDb ){.      sq
7d90: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
7da0: 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61  z, zDb, ".", zTa
7db0: 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29  b, ".", zCol, 0)
7dc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7dd0: 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71  zTab ){.      sq
7de0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
7df0: 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  z, zTab, ".", zC
7e00: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ol, 0);.    }els
7e10: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  e{.      z = sql
7e20: 69 74 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b  iteStrDup(zCol);
7e30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7e40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7e50: 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20  e, zErr, z);.   
7e60: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
7e70: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72      pTopNC->nErr
7e80: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
7e90: 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61   a column from a
7ea0: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69   table in pSrcLi
7eb0: 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  st is referenced
7ec0: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20  , then record.  
7ed0: 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20  ** this fact in 
7ee0: 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d  the pSrcList.a[]
7ef0: 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b  .colUsed bitmask
7f00: 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73  .  Column 0 caus
7f10: 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f  es.  ** bit 0 to
7f20: 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e   be set.  Column
7f30: 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20   1 sets bit 1.  
7f40: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
7f50: 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d  f the.  ** colum
7f60: 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  n number is grea
7f70: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d  ter than the num
7f80: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ber of bits in t
7f90: 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
7fa0: 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67  then set the hig
7fb0: 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74  h-order bit of t
7fc0: 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f  he bitmask..  */
7fd0: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  .  if( pExpr->iC
7fe0: 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74  olumn>=0 && pMat
7ff0: 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ch!=0 ){.    int
8000: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   n = pExpr->iCol
8010: 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  umn;.    if( n>=
8020: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
8030: 38 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  8 ){.      n = s
8040: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
8050: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  -1;.    }.    as
8060: 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43  sert( pMatch->iC
8070: 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54  ursor==pExpr->iT
8080: 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74  able );.    pMat
8090: 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 31  ch->colUsed |= 1
80a0: 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70  <<n;.  }..lookup
80b0: 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43  name_end:.  /* C
80c0: 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
80d0: 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
80e0: 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c  Free(zDb);.  sql
80f0: 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20  iteFree(zTab);. 
8100: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8110: 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  te(pExpr->pLeft)
8120: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
8130: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
8140: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d  xprDelete(pExpr-
8150: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70  >pRight);.  pExp
8160: 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  r->pRight = 0;. 
8170: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
8180: 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61  COLUMN;.lookupna
8190: 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69  me_end_2:.  sqli
81a0: 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  teFree(zCol);.  
81b0: 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20  if( cnt==1 ){.  
81c0: 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30    assert( pNC!=0
81d0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   );.    sqlite3A
81e0: 75 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20  uthRead(pParse, 
81f0: 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63  pExpr, pNC->pSrc
8200: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
8210: 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63 68  Match && !pMatch
8220: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
8230: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
8240: 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20   pMatch->pTab;. 
8250: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72     }.    /* Incr
8260: 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76  ement the nRef v
8270: 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65  alue on all name
8280: 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54   contexts from T
8290: 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a  opNC up to.    *
82a0: 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72  * the point wher
82b0: 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68  e the name match
82c0: 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b  ed. */.    for(;
82d0: 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ;){.      assert
82e0: 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20  ( pTopNC!=0 );. 
82f0: 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65       pTopNC->nRe
8300: 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  f++;.      if( p
8310: 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65  TopNC==pNC ) bre
8320: 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43  ak;.      pTopNC
8330: 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74   = pTopNC->pNext
8340: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
8350: 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rn 0;.  } else {
8360: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
8370: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
8380: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
8390: 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63  gned as an xFunc
83a0: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
83b0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c  e()..**.** Resol
83c0: 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  ve symbolic name
83d0: 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  s into TK_COLUMN
83e0: 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74   operators for t
83f0: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f  he current.** no
8400: 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  de in the expres
8410: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
8420: 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  rn 0 to continue
8430: 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e   the search down
8440: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20  .** the tree or 
8450: 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74  2 to abort the t
8460: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20  ree walk..**.** 
8470: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
8480: 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65  o does error che
8490: 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72  cking and name r
84a0: 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a  esolution for.**
84b0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e   function names.
84c0: 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66    The operator f
84d0: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
84e0: 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65  ctions is change
84f0: 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46  d.** to TK_AGG_F
8500: 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74  UNCTION..*/.stat
8510: 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c  ic int nameResol
8520: 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41  verStep(void *pA
8530: 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  rg, Expr *pExpr)
8540: 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  {.  NameContext 
8550: 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74  *pNC = (NameCont
8560: 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 53 72 63  ext*)pArg;.  Src
8570: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 3b 0a  List *pSrcList;.
8580: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
8590: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
85a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
85b0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
85c0: 0a 20 20 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  .  pSrcList = pN
85d0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 70  C->pSrcList;.  p
85e0: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
85f0: 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  rse;..  if( Expr
8600: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
8610: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
8620: 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  d) ) return 1;. 
8630: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
8640: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
8650: 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ved);.#ifndef ND
8660: 45 42 55 47 0a 20 20 69 66 28 20 70 53 72 63 4c  EBUG.  if( pSrcL
8670: 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ist ){.    int i
8680: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8690: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
86a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
86b0: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
86c0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
86d0: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
86e0: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
86f0: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
8700: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
8710: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
8720: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
8730: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
8740: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
8750: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
8760: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
8770: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
8780: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
8790: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
87a0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
87b0: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
87c0: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
87d0: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
87e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
87f0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
8800: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
8810: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
8820: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
8830: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
8840: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
8850: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
8860: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
8870: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
8880: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
8890: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
88a0: 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  a column..    */
88b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
88c0: 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e   {.      lookupN
88d0: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
88e0: 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c  , &pExpr->token,
88f0: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
8900: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8910: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
8920: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
8930: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
8940: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
8950: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
8960: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
8970: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
8980: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
8990: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
89a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f  Column;.      To
89b0: 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20  ken *pTable;.   
89c0: 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20     Token *pDb;. 
89d0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
89e0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
89f0: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
8a00: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
8a10: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
8a20: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
8a30: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
8a40: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  ID ){.        pD
8a50: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  b = 0;.        p
8a60: 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e  Table = &pExpr->
8a70: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
8a80: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
8a90: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  &pRight->token;.
8aa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8ab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
8ac0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
8ad0: 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  );.        pDb =
8ae0: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
8af0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
8b00: 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d  Table = &pRight-
8b10: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
8b20: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
8b30: 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74   &pRight->pRight
8b40: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
8b50: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
8b60: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
8b70: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
8b80: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
8b90: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8ba0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
8bb0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
8bc0: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
8bd0: 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a  e TK_CONST_FUNC:
8be0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
8bf0: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
8c00: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
8c10: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
8c20: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
8c30: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
8c40: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
8c50: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
8c60: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
8c70: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
8c80: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
8c90: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
8ca0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
8cb0: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
8cc0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
8cd0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
8ce0: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
8cf0: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
8d00: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
8d10: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
8d20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8d30: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
8d40: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
8d50: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
8d60: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t i;.      int n
8d70: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
8d80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8d90: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
8da0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  n function name 
8db0: 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
8dc0: 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
8dd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
8de0: 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  tion name. */.  
8df0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
8e00: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8e10: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
8e20: 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f  bout the functio
8e30: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  n */.      int e
8e40: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
8e50: 3e 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61  >enc;  /* The da
8e60: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
8e70: 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20  */..      zId = 
8e80: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
8e90: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
8ea0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
8eb0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
8ec0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
8ed0: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
8ee0: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
8ef0: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
8f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
8f10: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
8f20: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
8f30: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c  b, zId, nId, -1,
8f40: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
8f50: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
8f60: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
8f70: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
8f80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8f90: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
8fa0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
8fb0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
8fc0: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
8fd0: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
8fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8ff0: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 70  if( is_agg && !p
9000: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a  NC->allowAgg ){.
9010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9020: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9030: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
9040: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
9050: 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b  *s()", nId,zId);
9060: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
9070: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
9080: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
9090: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
90a0: 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  h_func ){.      
90b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
90c0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
90d0: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  ch function: %.*
90e0: 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  s", nId, zId);. 
90f0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
9100: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
9110: 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  if( wrong_num_ar
9120: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gs ){.        sq
9130: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9140: 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62  arse,"wrong numb
9150: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9160: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  to function %.*s
9170: 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ()",.           
9180: 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20    nId, zId);.   
9190: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
91a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
91b0: 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20  if( is_agg ){.  
91c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
91d0: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
91e0: 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  N;.        pNC->
91f0: 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  hasAgg = 1;.    
9200: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
9210: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f  _agg ) pNC->allo
9220: 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  wAgg = 0;.      
9230: 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45  for(i=0; pNC->nE
9240: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
9250: 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b  +){.        walk
9260: 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e  ExprTree(pList->
9270: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65  a[i].pExpr, name
9280: 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e  ResolverStep, pN
9290: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
92a0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
92b0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  NC->allowAgg = 1
92c0: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d  ;.      /* FIX M
92d0: 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70  E:  Compute pExp
92e0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65  r->affinity base
92f0: 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65  d on the expecte
9300: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  d return.      *
9310: 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75  * type of the fu
9320: 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f  nction .      */
9330: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73  .      return is
9340: 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  _agg;.    }.#ifn
9350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9360: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
9370: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
9380: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
9390: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
93a0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
93b0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
93c0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ct ){.        in
93d0: 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52  t nRef = pNC->nR
93e0: 65 66 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ef;.        sqli
93f0: 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
9400: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9410: 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20  pSelect, pNC);. 
9420: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9430: 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29  NC->nRef>=nRef )
9440: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52  ;.        if( nR
9450: 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b  ef!=pNC->nRef ){
9460: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53  .          ExprS
9470: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
9480: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b  , EP_VarSelect);
9490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
94a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
94b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
94c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
94d0: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
94e0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
94f0: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
9500: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
9510: 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74  mns.  Nodes of t
9520: 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72  he form ID.ID or
9530: 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f   ID resolve into
9540: 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20   an.** index to 
9550: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  the table in the
9560: 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20   table list and 
9570: 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e  a column offset.
9580: 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f    The .** Expr.o
9590: 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e  pcode for such n
95a0: 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20  odes is changed 
95b0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54  to TK_COLUMN.  T
95c0: 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a  he Expr.iTable.*
95d0: 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67  * value is chang
95e0: 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ed to the index 
95f0: 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
9600: 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c  d table in pTabL
9610: 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20  ist.** plus the 
9620: 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54  "base" value.  T
9630: 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69  he base value wi
9640: 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65  ll ultimately be
9650: 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45  come the.** VDBE
9660: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
9670: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
9680: 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
9690: 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  o the referenced
96a0: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20  .** table.  The 
96b0: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c  Expr.iColumn val
96c0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
96d0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
96e0: 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20  e column .** of 
96f0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
9700: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
9710: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f  iColumn value fo
9720: 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  r the special.**
9730: 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73   ROWID column is
9740: 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45   -1.  Any INTEGE
9750: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
9760: 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73  lumn is tried as
9770: 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72   an.** alias for
9780: 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c   ROWID..**.** Al
9790: 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74  so resolve funct
97a0: 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68  ion names and ch
97b0: 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  eck the function
97c0: 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20  s for proper.** 
97d0: 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72  usage.  Make sur
97e0: 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e  e all function n
97f0: 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69  ames are recogni
9800: 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63  zed and all func
9810: 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68  tions.** have th
9820: 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
9830: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
9840: 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  Leave an error m
9850: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
9860: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20  rse->zErrMsg if 
9870: 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73  anything is amis
9880: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
9890: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
98a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
98b0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
98c0: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
98d0: 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74  tions then set t
98e0: 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f  he EP_Agg.** pro
98f0: 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70  perty on the exp
9900: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ression..*/.int 
9910: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
9920: 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43  veNames(.  NameC
9930: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
9940: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
9950: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
9960: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
9970: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
9980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
9990: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
99a0: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
99b0: 20 20 69 6e 74 20 73 61 76 65 64 48 61 73 41 67    int savedHasAg
99c0: 67 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  g;.  if( pExpr==
99d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
99e0: 73 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e  savedHasAgg = pN
99f0: 43 2d 3e 68 61 73 41 67 67 3b 0a 20 20 70 4e 43  C->hasAgg;.  pNC
9a00: 2d 3e 68 61 73 41 67 67 20 3d 20 30 3b 0a 20 20  ->hasAgg = 0;.  
9a10: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78  walkExprTree(pEx
9a20: 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  pr, nameResolver
9a30: 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66  Step, pNC);.  if
9a40: 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b  ( pNC->nErr>0 ){
9a50: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
9a60: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
9a70: 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rror);.  }.  if(
9a80: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a   pNC->hasAgg ){.
9a90: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
9aa0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67  rty(pExpr, EP_Ag
9ab0: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
9ac0: 73 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20  savedHasAgg ){. 
9ad0: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
9ae0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
9af0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9b00: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
9b10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f  );.}../*.** A po
9b20: 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f  inter instance o
9b30: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
9b40: 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73   is used to pass
9b50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
9b60: 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72  through walkExpr
9b70: 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75  Tree into codeSu
9b80: 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f  bqueryStep()..*/
9b90: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
9ba0: 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72 79  QueryCoder Query
9bb0: 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75  Coder;.struct Qu
9bc0: 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72  eryCoder {.  Par
9bd0: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
9be0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
9bf0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61   context */.  Na
9c00: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20  meContext *pNC; 
9c10: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
9c20: 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69  of first enclosi
9c30: 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a  ng query */.};..
9c40: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9c50: 63 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65 72  code for subquer
9c60: 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72 61  ies and IN opera
9c70: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20 6f  tors..**.** IN o
9c80: 70 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20 69  perators comes i
9c90: 6e 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  n two forms:.**.
9ca0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70  **           exp
9cb0: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
9cc0: 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ** and.**       
9cd0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
9ce0: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
9cf0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
9d00: 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65 61   handled by crea
9d10: 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64 69  ting a set holdi
9d20: 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f  ng the list.** o
9d30: 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  f allowed values
9d40: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
9d50: 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53 45  rm causes the SE
9d60: 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74 65  LECT to generate
9d70: 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79   .** a temporary
9d80: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
9d90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
9da0: 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c  UBQUERY.void sql
9db0: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
9dc0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
9dd0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
9de0: 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20   int testAddr = 
9df0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
9e10: 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
9e20: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
9e30: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
9e40: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
9e50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
9e60: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
9e70: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
9e80: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
9e90: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
9ea0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
9eb0: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
9ec0: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
9ed0: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
9ee0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
9ef0: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
9f00: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
9f10: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
9f20: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
9f30: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
9f40: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
9f50: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
9f60: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
9f70: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
9f80: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
9f90: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
9fa0: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
9fb0: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
9fc0: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
9fd0: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
9fe0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
9ff0: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
a000: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
a010: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
a020: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
a030: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
a040: 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ct) && !pParse->
a050: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
a060: 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73   int mem = pPars
a070: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
a080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a090: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d  v, OP_MemLoad, m
a0a0: 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  em, 0);.    test
a0b0: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
a0c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
a0d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  , 0, 0);.    ass
a0e0: 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20  ert( testAddr>0 
a0f0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
a100: 63 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  c_failed );.    
a110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a120: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31  (v, OP_MemInt, 1
a130: 2c 20 6d 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20 73  , mem);.  }..  s
a140: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
a150: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
a160: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
a170: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
a180: 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f   KeyInfo keyInfo
a190: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
a1a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72  ;        /* Addr
a1b0: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 56 69  ess of OP_OpenVi
a1c0: 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  rtual instructio
a1d0: 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69  n */..      affi
a1e0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
a1f0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
a200: 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20  ->pLeft);..     
a210: 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73   /* Whether this
a220: 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c   is an 'x IN(SEL
a230: 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27  ECT...)' or an '
a240: 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29  x IN(<exprlist>)
a250: 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  '.      ** expre
a260: 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64  ssion it is hand
a270: 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79  led the same way
a280: 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  . A virtual tabl
a290: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
a2a0: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
a2b0: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
a2c0: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
a2d0: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
a2e0: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
a2f0: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
a300: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
a310: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
a320: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
a330: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
a340: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
a350: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
a360: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
a370: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
a380: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
a390: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
a3a0: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
a3b0: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
a3c0: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
a3d0: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
a3e0: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
a3f0: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
a400: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
a410: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
a420: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
a430: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
a440: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
a450: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
a460: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
a470: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
a480: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
a490: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
a4a0: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
a4b0: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
a4c0: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
a4d0: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
a4e0: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
a4f0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
a500: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
a510: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
a520: 6e 56 69 72 74 75 61 6c 2c 20 70 45 78 70 72 2d  nVirtual, pExpr-
a530: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
a540: 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e     memset(&keyIn
a550: 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  fo, 0, sizeof(ke
a560: 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b  yInfo));.      k
a570: 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20  eyInfo.nField = 
a580: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
a590: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a5a0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70  SetNumColumns, p
a5b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29  Expr->iTable, 1)
a5c0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ;..      if( pEx
a5d0: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
a5e0: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
a5f0: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
a600: 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
a610: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
a620: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a630: 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
a640: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
a650: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
a660: 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
a670: 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
a680: 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
a690: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a6a0: 20 20 20 20 20 69 6e 74 20 69 50 61 72 6d 20 3d       int iParm =
a6b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b   pExpr->iTable +
a6c0: 20 20 28 28 28 69 6e 74 29 61 66 66 69 6e 69 74    (((int)affinit
a6d0: 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20  y)<<16);.       
a6e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
a6f0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
a700: 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
a710: 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
a720: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
a730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
a740: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
a750: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  xpr->pSelect, SR
a760: 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c  T_Set, iParm, 0,
a770: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
a780: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
a790: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
a7a0: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  st;.        if( 
a7b0: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
a7c0: 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a 20 20  ->nExpr>0 ){ .  
a7d0: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
a7e0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72  aColl[0] = binar
a7f0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
a800: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a810: 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
a820: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d      pEList->a[0]
a830: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
a840: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
a850: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  f( pExpr->pList 
a860: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
a870: 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
a880: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
a890: 20 20 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20       **..** For 
a8a0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c  each expression,
a8b0: 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20   build an index 
a8c0: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61  key from the eva
a8d0: 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  luation and.    
a8e0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
a8f0: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
a900: 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72   table. If <expr
a910: 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74  > is a column, t
a920: 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20  hen use.        
a930: 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  ** that columns 
a940: 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75  affinity when bu
a950: 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79  ilding index key
a960: 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  s. If <expr> is 
a970: 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
a980: 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d   column, use num
a990: 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20  eric affinity.. 
a9a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a9b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
a9c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a9d0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
a9e0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
a9f0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
aa00: 49 74 65 6d 3b 0a 0a 20 20 20 20 20 20 20 20 69  Item;..        i
aa10: 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
aa20: 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
aa30: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
aa40: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 20 20 20  NUMERIC;.       
aa50: 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e   }.        keyIn
aa60: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45  fo.aColl[0] = pE
aa70: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
aa80: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c  l;..        /* L
aa90: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
aaa0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
aab0: 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
aac0: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73        for(i=pLis
aad0: 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
aae0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  pList->a; i>0; i
aaf0: 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
ab00: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
ab10: 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  2 = pItem->pExpr
ab20: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
ab30: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
ab40: 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  n is not constan
ab50: 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  t then we will n
ab60: 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
ab70: 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20   ** disable the 
ab80: 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65  test that was ge
ab90: 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68  nerated above th
aba0: 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20  at makes sure.  
abb0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
abc0: 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74  code only execut
abd0: 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73  es once.  Becaus
abe0: 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73  e for a non-cons
abf0: 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  tant.          *
ac00: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * expression we 
ac10: 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68  need to rerun th
ac20: 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d  is code each tim
ac30: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
ac40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74 65            if( te
ac50: 73 74 41 64 64 72 3e 30 20 26 26 20 21 73 71 6c  stAddr>0 && !sql
ac60: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
ac70: 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
ac80: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 61         VdbeOp *a
ac90: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
aca0: 47 65 74 4f 70 28 76 2c 20 74 65 73 74 41 64 64  GetOp(v, testAdd
acb0: 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1);.          
acc0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
acd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ace0: 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  3; i++){.       
acf0: 20 20 20 20 20 20 20 61 4f 70 5b 69 5d 2e 6f 70         aOp[i].op
ad00: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
ad20: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 41 64            testAd
ad30: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
ad40: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
ad50: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
ad60: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
ad70: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
ad80: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
ad90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ada0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
adb0: 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20   pE2);.         
adc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
add0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
ade0: 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
adf0: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
ae00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae10: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
ae20: 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
ae30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
ae40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
ae50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
ae60: 33 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  3(v, addr, (void
ae70: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f   *)&keyInfo, P3_
ae80: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
ae90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
aea0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
aeb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  :.    case TK_SE
aec0: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
aed0: 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20   This has to be 
aee0: 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e  a scalar SELECT.
aef0: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
af00: 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20  to put the.     
af10: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69   ** value of thi
af20: 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65  s select in a me
af30: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
af40: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a  cord the number.
af50: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
af60: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
af70: 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
af80: 0a 20 20 20 20 20 20 69 6e 74 20 73 6f 70 3b 0a  .      int sop;.
af90: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
afa0: 65 6c 3b 0a 0a 20 20 20 20 20 20 70 45 78 70 72  el;..      pExpr
afb0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72  ->iColumn = pPar
afc0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
afd0: 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
afe0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69  pSelect;.      i
aff0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
b000: 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20  _SELECT ){.     
b010: 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 4d 65 6d     sop = SRT_Mem
b020: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b030: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
b040: 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20  nst Token one = 
b050: 7b 20 22 31 22 2c 20 30 2c 20 31 20 7d 3b 0a 20  { "1", 0, 1 };. 
b060: 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54         sop = SRT
b070: 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
b080: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b090: 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c  Delete(pSel->pEL
b0a0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 53  ist);.        pS
b0b0: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  el->pEList = sql
b0c0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
b0d0: 6e 64 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20  nd(0, .         
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
b100: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26  INTEGER, 0, 0, &
b110: 6f 6e 65 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  one), 0);.      
b120: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  }.      sqlite3S
b130: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
b140: 65 6c 2c 20 73 6f 70 2c 20 70 45 78 70 72 2d 3e  el, sop, pExpr->
b150: 69 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30  iColumn, 0, 0, 0
b160: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
b170: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
b180: 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a  if( testAddr ){.
b190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b1a0: 75 6d 70 48 65 72 65 28 76 2c 20 74 65 73 74 41  umpHere(v, testA
b1b0: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ddr);.  }.  retu
b1c0: 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
b1d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b1e0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  UERY */../*.** G
b1f0: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72  enerate an instr
b200: 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  uction that will
b210: 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72   put the integer
b220: 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20   describe by.** 
b230: 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f  text z[0..n-1] o
b240: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  n the stack..*/.
b250: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
b260: 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c  Integer(Vdbe *v,
b270: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
b280: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
b290: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65  .  if( sqlite3Ge
b2a0: 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b  tInt32(z, &i) ){
b2b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b2c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b2d0: 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65  ger, i, 0);.  }e
b2e0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
b2f0: 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29  itsIn64Bits(z) )
b300: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b310: 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34  eOp3(v, OP_Int64
b320: 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20  , 0, 0, z, n);. 
b330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
b340: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
b350: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
b360: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
b370: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
b380: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
b390: 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
b3a0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
b3b0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
b3c0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e  ve the result on
b3d0: 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63   the top of stac
b3e0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  k..**.** This co
b3f0: 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
b400: 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
b410: 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
b420: 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
b430: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
b440: 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
b450: 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
b460: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
b470: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
b480: 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
b490: 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
b4a0: 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
b4b0: 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
b4c0: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
b4d0: 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
b4e0: 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
b4f0: 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
b500: 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
b510: 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
b520: 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
b530: 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
b540: 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
b550: 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
b560: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
b570: 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65   *pExpr){.  Vdbe
b580: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
b590: 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20  dbe;.  int op;. 
b5a0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
b5b0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  rn;.  if( pExpr=
b5c0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
b5d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b5e0: 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
b5f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b600: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
b610: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
b620: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
b630: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
b640: 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
b650: 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
b660: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63  nfo;.      struc
b670: 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
b680: 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  Col = &pAggInfo-
b690: 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67  >aCol[pExpr->iAg
b6a0: 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  g];.      if( !p
b6b0: 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
b6c0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ode ){.        s
b6d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b6e0: 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
b6f0: 43 6f 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20  Col->iMem, 0);. 
b700: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b710: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
b720: 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
b730: 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
b740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b750: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
b760: 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
b770: 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20  gIdx,.          
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
b7a0: 72 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  rColumn);.      
b7b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b7c0: 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
b7d0: 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
b7e0: 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
b7f0: 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
b800: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b810: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
b820: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
b830: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
b840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b850: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
b860: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
b870: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
b880: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
b890: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 45 78 70  nDefault(v, pExp
b8a0: 72 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e  r->pTab, pExpr->
b8b0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
b8c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b8d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b8e0: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 45 78  v, OP_Rowid, pEx
b8f0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
b900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b910: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b920: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
b930: 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
b940: 67 65 72 28 76 2c 20 70 45 78 70 72 2d 3e 74 6f  ger(v, pExpr->to
b950: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
b960: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
b970: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b980: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
b990: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
b9a0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b9b0: 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52  ( TK_FLOAT==OP_R
b9c0: 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eal );.      ass
b9d0: 65 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d  ert( TK_STRING==
b9e0: 4f 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20  OP_String8 );.  
b9f0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
ba00: 74 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20  teExpr(pExpr);. 
ba10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ba20: 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c  Op3(v, op, 0, 0,
ba30: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
ba40: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
ba50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ba60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ba70: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _NULL: {.      s
ba80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ba90: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
baa0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
bab0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
bac0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
bad0: 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
bae0: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
baf0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
bb00: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
bb10: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c     assert( TK_BL
bb20: 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29  OB==OP_HexBlob )
bb30: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 78 70  ;.      n = pExp
bb40: 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 2d 20 33 3b 0a  r->token.n - 3;.
bb50: 20 20 20 20 20 20 7a 20 3d 20 70 45 78 70 72 2d        z = pExpr-
bb60: 3e 74 6f 6b 65 6e 2e 7a 20 2b 20 32 3b 0a 20 20  >token.z + 2;.  
bb70: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30      assert( n>=0
bb80: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   );.      if( n=
bb90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20  =0 ){.        z 
bba0: 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = "";.      }.  
bbb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
bbc0: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
bbd0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  z, n);.      bre
bbe0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
bbf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
bc00: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73  IABLE: {.      s
bc10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bc20: 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
bc30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
bc40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
bc50: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b  pr->token.n>1 ){
bc60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bc70: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
bc80: 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  -1, pExpr->token
bc90: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
bca0: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
bcb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bcc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
bcd0: 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
bce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bcf0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45  , OP_MemLoad, pE
bd00: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
bd10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bd20: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
bd30: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
bd40: 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
bd50: 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
bd60: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
bd70: 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
bd80: 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
bd90: 20 20 20 69 6e 74 20 61 66 66 2c 20 6f 70 3b 0a     int aff, op;.
bda0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bdb0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
bdc0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
bdd0: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
bde0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
bdf0: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  xpr->token);.   
be00: 20 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29     switch( aff )
be10: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  {.        case S
be20: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
be30: 52 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 54 6f 49  R:   op = OP_ToI
be40: 6e 74 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  nt;      break;.
be50: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
be60: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a  ITE_AFF_NUMERIC:
be70: 20 20 20 6f 70 20 3d 20 4f 50 5f 54 6f 4e 75 6d     op = OP_ToNum
be80: 65 72 69 63 3b 20 20 62 72 65 61 6b 3b 0a 20 20  eric;  break;.  
be90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bea0: 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20 20  E_AFF_TEXT:     
beb0: 20 6f 70 20 3d 20 4f 50 5f 54 6f 54 65 78 74 3b   op = OP_ToText;
bec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bed0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bee0: 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 6f  AFF_NONE:      o
bef0: 70 20 3d 20 4f 50 5f 54 6f 42 6c 6f 62 3b 20 20  p = OP_ToBlob;  
bf00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bf10: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
bf20: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
bf30: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
bf40: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
bf50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bf60: 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
bf70: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
bf80: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
bf90: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
bfa0: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
bfb0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
bfc0: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
bfd0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f  assert( TK_LT==O
bfe0: 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Lt );.      as
bff0: 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f  sert( TK_LE==OP_
c000: 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Le );.      asse
c010: 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74  rt( TK_GT==OP_Gt
c020: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c030: 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29  ( TK_GE==OP_Ge )
c040: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c050: 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a  TK_EQ==OP_Eq );.
c060: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c070: 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  _NE==OP_Ne );.  
c080: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c090: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c0a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
c0b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c0c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c0d0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
c0e0: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
c0f0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
c100: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
c110: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
c120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c130: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
c140: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
c150: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
c160: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
c170: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
c180: 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
c190: 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
c1a0: 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
c1b0: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
c1c0: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
c1d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
c1e0: 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
c1f0: 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
c200: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
c210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c220: 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a  _AND==OP_And );.
c230: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c240: 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20  _OR==OP_Or );.  
c250: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
c260: 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20  LUS==OP_Add );. 
c270: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c280: 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
c290: 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ct );.      asse
c2a0: 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52  rt( TK_REM==OP_R
c2b0: 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20  emainder );.    
c2c0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
c2d0: 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29  AND==OP_BitAnd )
c2e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c2f0: 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74  TK_BITOR==OP_Bit
c300: 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Or );.      asse
c310: 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50  rt( TK_SLASH==OP
c320: 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20  _Divide );.     
c330: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49   assert( TK_LSHI
c340: 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  FT==OP_ShiftLeft
c350: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c360: 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
c370: 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20  ShiftRight );.  
c380: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43      assert( TK_C
c390: 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74  ONCAT==OP_Concat
c3a0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
c3b0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c3c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
c3d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c3e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c3f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
c400: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c410: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
c420: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
c430: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c440: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
c450: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
c460: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
c470: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
c480: 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
c490: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
c4a0: 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70  OAT || pLeft->op
c4b0: 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
c4c0: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70          Token *p
c4d0: 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e   = &pLeft->token
c4e0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
c4f0: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
c500: 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20  ( p->n + 2 );.  
c510: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c        sprintf(z,
c520: 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20   "-%.*s", p->n, 
c530: 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  p->z);.        i
c540: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
c550: 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20  _FLOAT ){.      
c560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
c570: 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p3(v, OP_Real, 0
c580: 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b  , 0, z, p->n+1);
c590: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c5a0: 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e            codeIn
c5b0: 74 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e  teger(v, z, p->n
c5c0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +1);.        }. 
c5d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
c5e0: 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72  e(z);.        br
c5f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c600: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
c610: 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a  gh into TK_NOT *
c620: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
c630: 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20   TK_BITNOT:.    
c640: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
c650: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
c660: 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f  BITNOT==OP_BitNo
c670: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
c680: 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
c690: 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
c6a0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c6b0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
c6c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c6d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
c6e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
c6f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c700: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
c710: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
c720: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  L: {.      int d
c730: 65 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  est;.      asser
c740: 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
c750: 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20  _IsNull );.     
c760: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e   assert( TK_NOTN
c770: 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20  ULL==OP_NotNull 
c780: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c790: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c7a0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a  Integer, 1, 0);.
c7b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c7c0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c7d0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
c7e0: 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65     dest = sqlite
c7f0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c800: 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  (v) + 2;.      s
c810: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c820: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
c830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c840: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
c850: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  dImm, -1, 0);.  
c860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c870: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
c880: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
c890: 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66     AggInfo *pInf
c8a0: 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49  o = pExpr->pAggI
c8b0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
c8c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c8d0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 49 6e 66 6f  P_MemLoad, pInfo
c8e0: 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
c8f0: 41 67 67 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20  Agg].iMem, 0);. 
c900: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c910: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
c920: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
c930: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
c940: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
c950: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
c960: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e  >pList;.      in
c970: 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 20  t nExpr = pList 
c980: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
c990: 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65   0;.      FuncDe
c9a0: 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
c9b0: 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63 6f  nt nId;.      co
c9c0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 20  nst char *zId;. 
c9d0: 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 4d 61       int constMa
c9e0: 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
c9f0: 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e  t i;.      u8 en
ca00: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
ca10: 65 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  enc;.      CollS
ca20: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
ca30: 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
ca40: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
ca50: 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   nId = pExpr->to
ca60: 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65  ken.n;.      pDe
ca70: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
ca80: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
ca90: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45  db, zId, nId, nE
caa0: 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  xpr, enc, 0);.  
cab0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
cac0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  !=0 );.      nEx
cad0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
cae0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
caf0: 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  rse, pList);.   
cb00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
cb10: 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b  xpr && i<32; i++
cb20: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
cb30: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
cb40: 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  tant(pList->a[i]
cb50: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
cb60: 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c       constMask |
cb70: 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20  = (1<<i);.      
cb80: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
cb90: 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  pDef->needCollSe
cba0: 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  q && !pColl ){. 
cbb0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
cbc0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
cbd0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
cbe0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
cbf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cc00: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  }.      if( pDef
cc10: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
cc20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
cc30: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  oll ) pColl = pP
cc40: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
cc50: 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
cc60: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
cc70: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
cc80: 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
cc90: 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
cca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ccb0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
ccc0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  _Function, const
ccd0: 4d 61 73 6b 2c 20 6e 45 78 70 72 2c 20 28 63 68  Mask, nExpr, (ch
cce0: 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e  ar*)pDef, P3_FUN
ccf0: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 62 72 65  CDEF);.      bre
cd00: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
cd10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
cd20: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
cd30: 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
cd40: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
cd50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
cd60: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
cd70: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
cd80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd90: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
cda0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
cdb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 0);.      Vdbe
cdc0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c  Comment((v, "# l
cdd0: 6f 61 64 20 73 75 62 71 75 65 72 79 20 72 65 73  oad subquery res
cde0: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72  ult"));.      br
cdf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ce00: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
ce10: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
ce20: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
ce30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
ce40: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
ce50: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  rse, pExpr);..  
ce60: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
ce70: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
ce80: 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20  o use to create 
ce90: 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72  a key from the r
cea0: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
ceb0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
cec0: 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
ced0: 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
cee0: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
cef0: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f  or.      ** P3 o
cf00: 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
cf10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cf20: 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61  affinity = compa
cf30: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
cf40: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  xpr);..      sql
cf50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cf60: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
cf70: 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  0);..      /* Co
cf80: 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  de the <expr> fr
cf90: 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
cfa0: 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72  ..)". The tempor
cfb0: 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ary table.      
cfc0: 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
cfd0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
cfe0: 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
cff0: 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e  p the (...) set.
d000: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d010: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d020: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d030: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64  Left);.      add
d040: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
d050: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
d060: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d070: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
d080: 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29  ull, -1, addr+4)
d090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d0a0: 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20  addr + 0 */.    
d0b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d0c0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c  Op(v, OP_Pop, 2,
d0d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d0e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d0f0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  P_Null, 0, 0);. 
d100: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d110: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
d120: 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20  , 0, addr+7);.  
d130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
d140: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
d150: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69  ord, 1, 0, &affi
d160: 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61  nity, 1);   /* a
d170: 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20  ddr + 4 */.     
d180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d190: 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  p(v, OP_Found, p
d1a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
d1b0: 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+7);.      sql
d1c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d1d0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
d1e0: 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
d1f0: 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 36       /* addr + 6
d200: 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65 61 6b   */..      break
d210: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
d220: 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
d230: 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
d240: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
d250: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
d260: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
d270: 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
d280: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  pr->pList->a;.  
d290: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
d2a0: 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
d2b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d2c0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d2d0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
d2e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d2f0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
d300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d310: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d320: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
d330: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
d340: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
d350: 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20   OP_Ge, 0, 0);. 
d360: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d370: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
d380: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
d390: 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  LItem++;.      p
d3a0: 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
d3b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
d3c0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d3d0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
d3e0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
d3f0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
d400: 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c  Right, OP_Le, 0,
d410: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d420: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d430: 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  P_And, 0, 0);.  
d440: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d450: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
d460: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
d470: 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AS: {.      sqli
d480: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d490: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d4a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d4b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
d4c0: 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
d4d0: 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  int expr_end_lab
d4e0: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75  el;.      int ju
d4f0: 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e  mpInst;.      in
d500: 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  t nExpr;.      i
d510: 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72  nt i;.      Expr
d520: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
d530: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d540: 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
d550: 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  lem;..      asse
d560: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  rt(pExpr->pList)
d570: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28  ;.      assert((
d580: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
d590: 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
d5a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
d5b0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
d5c0: 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
d5d0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
d5e0: 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
d5f0: 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
d600: 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
d610: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
d620: 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62      expr_end_lab
d630: 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
d640: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d650: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
d660: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
d670: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d680: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
d690: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Left);.      }. 
d6a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d6b0: 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
d6c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d6d0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
d6e0: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
d6f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
d700: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
d710: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d720: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d730: 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20  _Dup, 1, 1);.   
d740: 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20         jumpInst 
d750: 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50  = codeCompare(pP
d760: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d770: 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  ft, aListelem[i]
d780: 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  .pExpr,.        
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20           OP_Ne, 
d7b0: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 1);.         
d7c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d7d0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
d7e0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
d7f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  e{.          jum
d800: 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56  pInst = sqlite3V
d810: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
d820: 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  fNot, 1, 0);.   
d830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
d840: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
d850: 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
d860: 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  [i+1].pExpr);.  
d870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d880: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
d890: 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c  o, 0, expr_end_l
d8a0: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
d8b0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d8c0: 72 65 28 76 2c 20 6a 75 6d 70 49 6e 73 74 29 3b  re(v, jumpInst);
d8d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d8e0: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
d8f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d900: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d910: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
d920: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d930: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
d940: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d950: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d960: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
d970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d990: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
d9a0: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
d9b0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
d9c0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d9d0: 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  v, expr_end_labe
d9e0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
d9f0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
da00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
da10: 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
da20: 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  AISE: {.      if
da30: 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  ( !pParse->trigS
da40: 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
da50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
da60: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
da80: 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
da90: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
daa0: 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
dab0: 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  m");..return;.  
dac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
dad0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
dae0: 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
daf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
db00: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45  xpr->iColumn==OE
db10: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20  _Rollback ||.   
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
db30: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
db40: 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20  OE_Abort ||.    
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
db60: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
db70: 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
db80: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
db90: 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20  eExpr(pExpr);.  
dba0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dbb0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
dbc0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
dbd0: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
dbe0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
dc00: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
dc10: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
dc20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
dc30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
dc40: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
dc50: 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20  OE_Ignore );.   
dc60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
dc80: 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a  textPop, 0, 0);.
dc90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dca0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dcb0: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
dcc0: 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f  >trigStack->igno
dcd0: 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20  reJump);.       
dce0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
dcf0: 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52  , "# raise(IGNOR
dd00: 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  E)"));.      }. 
dd10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
dd20: 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  break;.  }.}..#i
dd30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dd40: 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20  T_TRIGGER./*.** 
dd50: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
dd60: 61 74 20 65 76 61 6c 75 74 65 73 20 74 68 65 20  at evalutes the 
dd70: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
dd80: 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20   and leaves the 
dd90: 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65  result.** on the
dda0: 20 73 74 61 63 6b 2e 20 20 53 65 65 20 61 6c 73   stack.  See als
ddb0: 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  o sqlite3ExprCod
ddc0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e()..**.** This 
ddd0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c  routine might al
dde0: 73 6f 20 63 61 63 68 65 20 74 68 65 20 72 65 73  so cache the res
ddf0: 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  ult and modify t
de00: 68 65 20 70 45 78 70 72 20 74 72 65 65 0a 2a 2a  he pExpr tree.**
de10: 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
de20: 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65   make use of the
de30: 20 63 61 63 68 65 64 20 72 65 73 75 6c 74 20 6f   cached result o
de40: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 65 76 61  n subsequent eva
de50: 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68  luations.** rath
de60: 65 72 20 74 68 61 6e 20 65 76 61 6c 75 61 74 65  er than evaluate
de70: 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65   the whole expre
de80: 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72  ssion again.  Tr
de90: 69 76 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ivial expression
dea0: 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63  s are.** not cac
deb0: 68 65 64 2e 20 20 49 66 20 74 68 65 20 65 78 70  hed.  If the exp
dec0: 72 65 73 73 69 6f 6e 20 69 73 20 63 61 63 68 65  ression is cache
ded0: 64 2c 20 69 74 73 20 72 65 73 75 6c 74 20 69 73  d, its result is
dee0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a   stored in a .**
def0: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
df00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
df10: 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68  3ExprCodeAndCach
df20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
df30: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
df40: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
df50: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
df60: 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72  iMem;.  int addr
df70: 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66 28 20  1, addr2;.  if( 
df80: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
df90: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
dfa0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
dfb0: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  v);.  sqlite3Exp
dfc0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
dfd0: 78 70 72 29 3b 0a 20 20 61 64 64 72 32 20 3d 20  xpr);.  addr2 = 
dfe0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
dff0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
e000: 20 61 64 64 72 32 3e 61 64 64 72 31 2b 31 20 7c   addr2>addr1+1 |
e010: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  | sqlite3VdbeGet
e020: 4f 70 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70  Op(v, addr1)->op
e030: 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f  code==OP_Functio
e040: 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20  n ){.    iMem = 
e050: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
e060: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
e070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e080: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
e090: 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20  ore, iMem, 0);. 
e0a0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
e0b0: 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a  K_REGISTER;.  }.
e0c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
e0d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
e0e0: 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
e0f0: 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
e100: 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
e110: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
e120: 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  list onto the st
e130: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ack..**.** Retur
e140: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
e150: 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20  elements pushed 
e160: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
e170: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
e180: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
e190: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e1a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e1b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
e1c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
e1d0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
e1e0: 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
e1f0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ed */.){.  struc
e200: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e210: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
e220: 20 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   n;.  if( pList=
e230: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
e240: 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
e250: 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  r;.  for(pItem=p
e260: 4c 69 73 74 2d 3e 61 2c 20 69 3d 6e 3b 20 69 3e  List->a, i=n; i>
e270: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
e280: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
e290: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49  rCode(pParse, pI
e2a0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d  tem->pExpr);.  }
e2b0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
e2c0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e2d0: 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
e2e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
e2f0: 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
e300: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
e310: 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
e320: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
e330: 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
e340: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
e350: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
e360: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
e370: 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
e380: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e390: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
e3a0: 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
e3b0: 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
e3c0: 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
e3d0: 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
e3e0: 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
e3f0: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  true..**.** This
e400: 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
e410: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
e420: 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
e430: 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
e440: 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
e450: 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
e460: 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
e470: 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
e480: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
e490: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
e4a0: 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
e4b0: 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
e4c0: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
e4d0: 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
e4e0: 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
e4f0: 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
e500: 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
e510: 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
e520: 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
e530: 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
e540: 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
e550: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
e560: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
e570: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
e580: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
e590: 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
e5a0: 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
e5b0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
e5c0: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
e5d0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
e5e0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
e5f0: 6e 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  n;.  op = pExpr-
e600: 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
e610: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
e620: 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _AND: {.      in
e630: 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
e640: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
e650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e660: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
e670: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
e680: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
e690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e6a0: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
e6b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
e6c0: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
e6d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e6e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
e6f0: 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
e700: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e710: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
e720: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
e730: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
e740: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
e750: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
e760: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e770: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
e780: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
e790: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
e7a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e7b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e7c0: 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
e7d0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
e7e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e7f0: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
e800: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
e810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e820: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
e830: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
e840: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
e850: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
e860: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
e870: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
e880: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
e890: 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20  T==OP_Lt );.    
e8a0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d    assert( TK_LE=
e8b0: 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20  =OP_Le );.      
e8c0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f  assert( TK_GT==O
e8d0: 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Gt );.      as
e8e0: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f  sert( TK_GE==OP_
e8f0: 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ge );.      asse
e900: 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  rt( TK_EQ==OP_Eq
e910: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e920: 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29  ( TK_NE==OP_Ne )
e930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e940: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
e950: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
e960: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e970: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
e980: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
e990: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
e9a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e9b0: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
e9c0: 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75  ht, op, dest, ju
e9d0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
e9e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e9f0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
ea00: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
ea10: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61  TNULL: {.      a
ea20: 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
ea30: 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
ea40: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ea50: 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e  NOTNULL==OP_NotN
ea60: 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ull );.      sql
ea70: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ea80: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
ea90: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
eaa0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
eab0: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
eac0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ead0: 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
eae0: 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  EN: {.      /* T
eaf0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78  he expression "x
eb00: 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
eb10: 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  " is implemented
eb20: 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
eb30: 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c      ** 1 IF (x <
eb40: 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20   y) GOTO 3.     
eb50: 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a   ** 2 IF (x <= z
eb60: 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20  ) GOTO <dest>.  
eb70: 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20      ** 3 ....   
eb80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
eb90: 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72  addr;.      Expr
eba0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
ebb0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
ebc0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
ebd0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
ebe0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
ebf0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ec00: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
ec10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ec20: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
ec30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
ec40: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ec50: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
ec60: 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f     addr = codeCo
ec70: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
ec80: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
ec90: 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75  Lt, 0, !jumpIfNu
eca0: 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67  ll);..      pRig
ecb0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
ecc0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
ecd0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ece0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
ecf0: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
ed00: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
ed10: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
ed20: 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70  P_Le, dest, jump
ed30: 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20  IfNull);..      
ed40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ed50: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
ed60: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
ed70: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ed80: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
ed90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eda0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
edb0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
edc0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
edd0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
ede0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
edf0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
ee00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee10: 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d  Op(v, OP_If, jum
ee20: 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a  pIfNull, dest);.
ee30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ee40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
ee50: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
ee60: 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
ee70: 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
ee80: 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
ee90: 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
eea0: 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
eeb0: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
eec0: 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
eed0: 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
eee0: 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
eef0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ef00: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
ef10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
ef20: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
ef30: 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
ef40: 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
ef50: 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
ef60: 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66  ull is true or f
ef70: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
ef80: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c  umpIfNull is fal
ef90: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
efa0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
efb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
efc0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
efd0: 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
efe0: 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
eff0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f000: 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
f010: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
f020: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
f030: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
f040: 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64  of pExpr->op and
f050: 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20   op are related 
f060: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
f070: 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70  .  **       pExp
f080: 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
f090: 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d   op.  **       -
f0a0: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20  --------        
f0b0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a    ----------.  *
f0c0: 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c  *       TK_ISNUL
f0d0: 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f  L          OP_No
f0e0: 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  tNull.  **      
f0f0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20   TK_NOTNULL     
f100: 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20      OP_IsNull.  
f110: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20  **       TK_NE  
f120: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45              OP_E
f130: 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  q.  **       TK_
f140: 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EQ              
f150: 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Ne.  **      
f160: 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20   TK_GT          
f170: 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20      OP_Le.  **  
f180: 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20       TK_LE      
f190: 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20          OP_Gt.  
f1a0: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20  **       TK_GE  
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
f1c0: 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  t.  **       TK_
f1d0: 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LT              
f1e0: 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OP_Ge.  **.  ** 
f1f0: 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73  For other values
f200: 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f   of pExpr->op, o
f210: 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61  p is undefined a
f220: 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20  nd unused..  ** 
f230: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f  The value of TK_
f240: 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e   and OP_ constan
f250: 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20  ts are arranged 
f260: 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a  such that we.  *
f270: 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  * can compute th
f280: 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20  e mapping above 
f290: 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  using the follow
f2a0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ing expression..
f2b0: 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76    ** Assert()s v
f2c0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
f2d0: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f  omputation is co
f2e0: 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70  rrect..  */.  op
f2f0: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28   = ((pExpr->op+(
f300: 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29  TK_ISNULL&1))^1)
f310: 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a  -(TK_ISNULL&1);.
f320: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72  .  /* Verify cor
f330: 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  rect alignment o
f340: 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
f350: 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61  nstants.  */.  a
f360: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f370: 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f  !=TK_ISNULL || o
f380: 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  p==OP_NotNull );
f390: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
f3a0: 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ->op!=TK_NOTNULL
f3b0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c   || op==OP_IsNul
f3c0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
f3d0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20  Expr->op!=TK_NE 
f3e0: 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a  || op==OP_Eq );.
f3f0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
f400: 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70  >op!=TK_EQ || op
f410: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ne );.  ass
f420: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
f430: 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LT || op==OP_
f440: 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Ge );.  assert( 
f450: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45  pExpr->op!=TK_LE
f460: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b   || op==OP_Gt );
f470: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
f480: 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f  ->op!=TK_GT || o
f490: 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73  p==OP_Le );.  as
f4a0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
f4b0: 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_GE || op==OP
f4c0: 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _Lt );..  switch
f4d0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
f4e0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
f4f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f500: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
f510: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
f520: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
f530: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
f540: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
f550: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
f560: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
f570: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
f580: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f590: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
f5a0: 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
f5b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f5c0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
f5d0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
f5e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f5f0: 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
f600: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
f610: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
f620: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
f630: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
f640: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
f650: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f660: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
f670: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f680: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
f690: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f6a0: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
f6b0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
f6c0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
f6d0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
f6e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f6f0: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
f700: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
f710: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
f720: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
f730: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
f740: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
f750: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f760: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
f770: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
f780: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
f790: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
f7a0: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
f7b0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
f7c0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
f7d0: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
f7e0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
f7f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f800: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
f810: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
f820: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
f830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f840: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f850: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
f860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f870: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
f880: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
f890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f8a0: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
f8b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
f8c0: 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54  ession is "x BET
f8d0: 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49  WEEN y AND z". I
f8e0: 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  t is implemented
f8f0: 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
f900: 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e      ** 1 IF (x >
f910: 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  = y) GOTO 3.    
f920: 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73    ** 2 GOTO <des
f930: 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46  t>.      ** 3 IF
f940: 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64   (x > z) GOTO <d
f950: 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  est>.      */.  
f960: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
f970: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
f980: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
f990: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
f9a0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
f9b0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
f9c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f9d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
f9e0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
f9f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fa00: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
fa10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
fa20: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
fa30: 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ht);.      addr 
fa40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
fa50: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
fa60: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
fa70: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
fa80: 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64  ight, OP_Ge, add
fa90: 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  r+3, !jumpIfNull
faa0: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
fab0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fac0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
fad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fae0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
faf0: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
fb00: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
fb10: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
fb20: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
fb30: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fb40: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
fb50: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
fb60: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
fb70: 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20  t, OP_Gt, dest, 
fb80: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
fb90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
fba0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
fbb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
fbc0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
fbd0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
fbe0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fbf0: 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e  P_IfNot, jumpIfN
fc00: 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
fc10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fc20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61   }.}../*.** Do a
fc30: 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
fc40: 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
fc50: 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
fc60: 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
fc70: 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65  ).** if they are
fc80: 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72   identical and r
fc90: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
fca0: 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
fcb0: 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y way..*/.int sq
fcc0: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
fcd0: 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
fce0: 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pB){.  int i;. 
fcf0: 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20   if( pA==0 ){.  
fd00: 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a    return pB==0;.
fd10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d 3d    }else if( pB==
fd20: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
fd30: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  0;.  }.  if( pA-
fd40: 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65  >op!=pB->op ) re
fd50: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
fd60: 41 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  A->flags & EP_Di
fd70: 73 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c  stinct)!=(pB->fl
fd80: 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
fd90: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
fda0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
fdb0: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
fdc0: 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29  ft, pB->pLeft) )
fdd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fde0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d   !sqlite3ExprCom
fdf0: 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c  pare(pA->pRight,
fe00: 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72   pB->pRight) ) r
fe10: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
fe20: 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  A->pList ){.    
fe30: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30  if( pB->pList==0
fe40: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
fe50: 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e   if( pA->pList->
fe60: 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74  nExpr!=pB->pList
fe70: 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
fe80: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
fe90: 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45   i<pA->pList->nE
fea0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
feb0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
fec0: 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69  rCompare(pA->pLi
fed0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
fee0: 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pB->pList->a[i].
fef0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
ff00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ff10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
ff20: 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20  e if( pB->pList 
ff30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ff40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70  .  }.  if( pA->p
ff50: 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53  Select || pB->pS
ff60: 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30  elect ) return 0
ff70: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62  ;.  if( pA->iTab
ff80: 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c  le!=pB->iTable |
ff90: 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  | pA->iColumn!=p
ffa0: 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
ffb0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
ffc0: 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20  >token.z ){.    
ffd0: 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d  if( pB->token.z=
ffe0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fff0: 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
10000 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20  .n!=pA->token.n 
10010 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
10020 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
10030 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c  Cmp(pA->token.z,
10040 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42   pB->token.z, pB
10050 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20  ->token.n)!=0 ) 
10060 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10070 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 0a 2f 2a  return 1;.}.../*
10080 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
10090 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
100a0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
100b0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
100c0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
100d0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
100e0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
100f0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
10100 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
10110 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
10120 6f 43 6f 6c 75 6d 6e 28 41 67 67 49 6e 66 6f 20  oColumn(AggInfo 
10130 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  *pInfo){.  int i
10140 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 41  ;.  i = sqlite3A
10150 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 28 76 6f  rrayAllocate((vo
10160 69 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f  id**)&pInfo->aCo
10170 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
10180 3e 61 43 6f 6c 5b 30 5d 29 2c 20 33 29 3b 0a 20  >aCol[0]), 3);. 
10190 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
101a0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
101b0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20 20   return i;.}    
101c0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
101d0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
101e0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
101f0 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  [] array.  Retur
10200 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a 2a  n the index of.*
10210 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  * the new elemen
10220 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  t.  Return a neg
10230 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
10240 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a 2f  malloc fails..*/
10250 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 41  .static int addA
10260 67 67 49 6e 66 6f 46 75 6e 63 28 41 67 67 49 6e  ggInfoFunc(AggIn
10270 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
10280 74 20 69 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  t i;.  i = sqlit
10290 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
102a0 28 76 6f 69 64 2a 2a 29 26 70 49 6e 66 6f 2d 3e  (void**)&pInfo->
102b0 61 46 75 6e 63 2c 20 73 69 7a 65 6f 66 28 70 49  aFunc, sizeof(pI
102c0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 20  nfo->aFunc[0]), 
102d0 32 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b  2);.  if( i<0 ){
102e0 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
102f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
10300 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
10310 73 20 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f  s is an xFunc fo
10320 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  r walkExprTree()
10330 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
10340 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78  nt .** sqlite3Ex
10350 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
10360 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
10370 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
10380 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
10390 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
103a0 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
103b0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
103c0 7a 65 73 20 74 68 65 20 61 67 67 72 65 67 61 74  zes the aggregat
103d0 65 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45  e function at pE
103e0 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  xpr..*/.static i
103f0 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
10400 61 74 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ate(void *pArg, 
10410 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
10420 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
10430 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
10440 65 43 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b  eContext *)pArg;
10450 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10460 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
10470 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
10480 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
10490 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
104a0 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
104b0 70 41 67 67 49 6e 66 6f 3b 0a 20 20 0a 0a 20 20  pAggInfo;.  ..  
104c0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
104d0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
104e0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
104f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
10500 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
10510 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
10520 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
10530 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
10540 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
10550 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
10560 20 20 20 69 66 28 20 70 53 72 63 4c 69 73 74 20     if( pSrcList 
10570 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
10580 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
10590 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
105a0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ->a;.        for
105b0 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
105c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
105d0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
105e0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
105f0 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20 20 20  col *pCol;.     
10600 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
10610 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69  iTable==pItem->i
10620 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
10630 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72        /* If we r
10640 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
10650 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70   it means that p
10660 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61  Expr refers to a
10670 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
10680 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e     ** that is in
10690 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
106a0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
106b0 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20  e query.  .     
106c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
106d0 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e        ** Make an
106e0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63   entry for the c
106f0 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66  olumn in pAggInf
10700 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65  o->aCol[] if the
10710 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
10720 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72  * is not an entr
10730 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  y there already.
10740 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
10750 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
10760 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
10770 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
10780 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
10790 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
107a0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
107b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
107c0 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
107d0 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
107f0 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
10800 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
10820 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
10830 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
10850 69 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d  if( i>=pAggInfo-
10860 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 28 69 20 3d  >nColumn && (i =
10870 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
10880 6e 28 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  n(pAggInfo))>=0 
10890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
108a0 20 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66   pCol = &pAggInf
108b0 6f 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  o->aCol[i];.    
108c0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
108d0 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
108e0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
108f0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
10900 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
10910 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
10920 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
10930 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
10940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
10950 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
10960 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
10970 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
10980 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
10990 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
109a0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
109b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
109c0 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
109e0 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
109f0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
10a00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
10a10 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
10a20 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
10a30 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
10a40 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
10a50 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
10a60 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
10a70 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
10a80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
10a90 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
10aa0 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
10ad0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
10ae0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
10af0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
10b10 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
10b20 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
10b50 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
10b70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
10b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10b90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10bb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
10bc0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
10bd0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
10be0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
10bf0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
10c00 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
10c10 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
10c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10c30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10c40 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
10c50 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
10c60 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
10c70 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
10c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
10c90 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
10ca0 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
10cb0 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
10cc0 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
10cd0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
10ce0 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
10cf0 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
10d00 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
10d10 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
10d20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
10d30 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
10d40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10d50 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
10d60 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
10d70 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
10d80 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
10d90 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
10da0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
10db0 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  g = i;.         
10dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10dd0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
10de0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49  Expr->iTable==pI
10df0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a  tem->iCursor */.
10e00 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
10e10 20 6c 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c   loop over pSrcL
10e20 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ist */.      }. 
10e30 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
10e40 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
10e50 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
10e60 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 4e  .      /* The pN
10e70 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 74 65 73  C->nDepth==0 tes
10e80 74 20 63 61 75 73 65 73 20 61 67 67 72 65 67 61  t causes aggrega
10e90 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
10ea0 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 20  subqueries.     
10eb0 20 2a 2a 20 74 6f 20 62 65 20 69 67 6e 6f 72 65   ** to be ignore
10ec0 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
10ed0 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20 29 7b  NC->nDepth==0 ){
10ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
10ef0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
10f00 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
10f10 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
10f20 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
10f30 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
10f40 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
10f50 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
10f60 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
10f70 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
10f80 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
10f90 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
10fa0 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
10fb0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
10fc0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
10fd0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
10fe0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
10ff0 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
11000 3e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20 29  >pExpr, pExpr) )
11010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  {.            br
11020 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
11030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11040 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67 49 6e     if( i>=pAggIn
11050 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20 20 20  fo->nFunc ){.   
11060 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70 72 20         /* pExpr 
11070 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20 4d 61  is original.  Ma
11080 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ke a new entry i
11090 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  n pAggInfo->aFun
110a0 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  c[].          */
110b0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65 6e  .          u8 en
110c0 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
110d0 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  enc;.          i
110e0 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e   = addAggInfoFun
110f0 63 28 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  c(pAggInfo);.   
11100 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
11110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
11120 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
11130 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
11140 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
11150 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
11160 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
11170 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
11180 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nMem++;.        
11190 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
111a0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
111b0 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
111c0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
111d0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
111e0 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
111f0 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  en.n,.          
11200 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
11210 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70  pList ? pExpr->p
11220 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
11230 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
11240 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
11250 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
11260 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
11270 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
11280 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
11290 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
112a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
112b0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
112c0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
112d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
112e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
112f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
11300 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
11310 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
11320 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
11330 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
11340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
11350 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
11360 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
11370 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
11380 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  fo;.        retu
11390 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
113a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
113b0 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 73  cursively walk s
113c0 75 62 71 75 65 72 69 65 73 20 6c 6f 6f 6b 69 6e  ubqueries lookin
113d0 67 20 66 6f 72 20 54 4b 5f 43 4f 4c 55 4d 4e 20  g for TK_COLUMN 
113e0 6e 6f 64 65 73 20 74 68 61 74 20 6e 65 65 64 0a  nodes that need.
113f0 20 20 2a 2a 20 74 6f 20 62 65 20 63 68 61 6e 67    ** to be chang
11400 65 64 20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c  ed to TK_AGG_COL
11410 55 4d 4e 2e 20 20 42 75 74 20 69 6e 63 72 65 6d  UMN.  But increm
11420 65 6e 74 20 6e 44 65 70 74 68 20 73 6f 20 74 68  ent nDepth so th
11430 61 74 0a 20 20 2a 2a 20 54 4b 5f 41 47 47 5f 46  at.  ** TK_AGG_F
11440 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
11450 20 73 75 62 71 75 65 72 69 65 73 20 77 69 6c 6c   subqueries will
11460 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   be unchanged.. 
11470 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
11480 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
11490 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20  pNC->nDepth++;. 
114a0 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70     walkSelectExp
114b0 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  r(pExpr->pSelect
114c0 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
114d0 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e  te, pNC);.    pN
114e0 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d  C->nDepth--;.  }
114f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11500 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
11510 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
11520 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
11530 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
11540 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
11550 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
11560 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
11570 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
11580 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61  g[] array..** Ma
11590 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e  ke additional en
115a0 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61  tries to the pPa
115b0 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
115c0 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
115d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
115e0 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
115f0 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
11600 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
11610 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
11620 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
11630 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e  rResolveNames().
11640 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73  .**.** If errors
11650 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65   are seen, leave
11660 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
11670 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64  e in zErrMsg and
11680 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   return.** the n
11690 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
116a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
116b0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
116c0 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
116d0 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
116e0 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  pr){.  int nErr 
116f0 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e  = pNC->pParse->n
11700 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  Err;.  walkExprT
11710 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79  ree(pExpr, analy
11720 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43  zeAggregate, pNC
11730 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d  );.  return pNC-
11740 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20  >pParse->nErr - 
11750 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nErr;.}../*.** C
11760 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41  all sqlite3ExprA
11770 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
11780 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
11790 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a  ression in an.**
117a0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
117b0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
117c0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
117d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
117e0 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  r is found, the 
117f0 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20  analysis is cut 
11800 73 68 6f 72 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  short..*/.int sq
11810 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
11820 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
11830 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
11840 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
11850 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11860 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
11870 20 69 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   i;.  int nErr =
11880 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
11890 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
118a0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
118b0 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 70 4c 69  nErr==0 && i<pLi
118c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
118d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
118e0 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 45  nErr += sqlite3E
118f0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
11900 61 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d  ates(pNC, pItem-
11910 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  >pExpr);.    }. 
11920 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
11930 3b 0a 7d 0a                                      ;.}.