/ Hex Artifact Content
Login

Artifact 94dce12d5228af02fdafc23e56abfeae25f3b694:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 32 31 31 20 32 30 30 35 2f 30 37 2f 30 38 20  .211 2005/07/08 
0220: 31 38 3a 32 35 3a 32 36 20 64 72 68 20 45 78 70  18:25:26 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 72 65 74 75 72 6e 20 28 61 66 66 31 20     return (aff1 
0ba0: 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  + aff2);.  }.}..
0bb0: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0bc0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0bd0: 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ator.  Return th
0be0: 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
0bf0: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
0c00: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74  e applied to bot
0c10: 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72  h operands prior
0c20: 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f   to doing the co
0c30: 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61  mparison..*/.sta
0c40: 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69  tic char compari
0c50: 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72  sonAffinity(Expr
0c60: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
0c70: 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20   aff;.  assert( 
0c80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
0c90: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0ca0: 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IN || pExpr->o
0cb0: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20  p==TK_LT ||.    
0cc0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
0cd0: 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_GT || pExpr-
0ce0: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45  >op==TK_GE || pE
0cf0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
0d00: 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  |.          pExp
0d10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
0d20: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0d30: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20  >pLeft );.  aff 
0d40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0d50: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0d60: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
0d70: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
0d80: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
0d90: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
0da0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29  pr->pRight, aff)
0db0: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
0dc0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
0dd0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0de0: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0df0: 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ity(pExpr->pSele
0e00: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ct->pEList->a[0]
0e10: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
0e20: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66  }.  else if( !af
0e30: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
0e40: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0e50: 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
0e60: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  aff;.}../*.** pE
0e70: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0e80: 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  son expression, 
0e90: 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e  eg. '=', '<', IN
0ea0: 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64  (...) etc..** id
0eb0: 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68  x_affinity is th
0ec0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e  e affinity of an
0ed0: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e   indexed column.
0ee0: 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   Return true.** 
0ef0: 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  if the index wit
0f00: 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61  h affinity idx_a
0f10: 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75  ffinity may be u
0f20: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
0f30: 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73  .** the comparis
0f40: 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a  on in pExpr..*/.
0f50: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
0f60: 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20  AffinityOk(Expr 
0f70: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78  *pExpr, char idx
0f80: 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68  _affinity){.  ch
0f90: 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69  ar aff = compari
0fa0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
0fb0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20 20  r);.  return .  
0fc0: 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41    (aff==SQLITE_A
0fd0: 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20 20  FF_NONE) ||.    
0fe0: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
0ff0: 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64 78 5f  _NUMERIC && idx_
1000: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1010: 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20 7c 7c  _AFF_INTEGER) ||
1020: 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54  .    (aff==SQLIT
1030: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 26 26  E_AFF_INTEGER &&
1040: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
1050: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
1060: 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d  C) ||.    (aff==
1070: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d  idx_affinity);.}
1080: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1090: 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61 74  he P1 value that
10a0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
10b0: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
10c0: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
10d0: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
10e0: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
10f0: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
1100: 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a   pExpr2..** If j
1110: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
1120: 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  e, then set the 
1130: 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65 20  low byte of the 
1140: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76  returned.** P1 v
1150: 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65  alue to tell the
1160: 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20   opcode to jump 
1170: 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73  if either expres
1180: 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65  sion.** evaluate
1190: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  s to NULL..*/.st
11a0: 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43  atic int binaryC
11b0: 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a 70  ompareP1(Expr *p
11c0: 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78  Expr1, Expr *pEx
11d0: 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  pr2, int jumpIfN
11e0: 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ull){.  char aff
11f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
1200: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1210: 20 20 72 65 74 75 72 6e 20 28 28 69 6e 74 29 73    return ((int)s
1220: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
1230: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
1240: 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c 3f  f))+(jumpIfNull?
1250: 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  0x100:0);.}../*.
1260: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1270: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
1280: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
1290: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
12a0: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
12b0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
12c0: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
12d0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
12e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
12f0: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
1300: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1310: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
1320: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
1330: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
1340: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1350: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
1360: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
1370: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
1380: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
1390: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
13a0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
13b0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
13c0: 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  * type..*/.stati
13d0: 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61 72  c CollSeq* binar
13e0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
13f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1400: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
1410: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f 6c   *pRight){.  Col
1420: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
1430: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1440: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
1450: 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b  .  if( !pColl ){
1460: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1470: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1480: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
1490: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
14a0: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  oll;.}../*.** Ge
14b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
14c0: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
14d0: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
14e0: 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65   int codeCompare
14f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1500: 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  e,    /* The par
1510: 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67  sing (and code g
1520: 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65  enerating) conte
1530: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  xt */.  Expr *pL
1540: 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  eft,      /* The
1550: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
1560: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
1570: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1580: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
1590: 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20  nt opcode,      
15a0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73   /* The comparis
15b0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  on opcode */.  i
15c0: 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
15d0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
15e0: 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74   true.  */.  int
15f0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1600: 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20  * If true, jump 
1610: 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  if either operan
1620: 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  d is NULL */.){.
1630: 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72    int p1 = binar
1640: 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66 74  yCompareP1(pLeft
1650: 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66  , pRight, jumpIf
1660: 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71  Null);.  CollSeq
1670: 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43 6f 6d   *p3 = binaryCom
1680: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
1690: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
16a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  t);.  return sql
16b0: 69 74 65 33 56 64 62 65 4f 70 33 28 70 50 61 72  ite3VdbeOp3(pPar
16c0: 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64  se->pVdbe, opcod
16d0: 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28 76 6f  e, p1, dest, (vo
16e0: 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53  id*)p3, P3_COLLS
16f0: 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  EQ);.}../*.** Co
1700: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
1710: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
1720: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
1730: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
1740: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
1750: 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  de is obtained f
1760: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
1770: 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ().  The calling
1780: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
1790: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
17a0: 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20  making sure the 
17b0: 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  node eventually 
17c0: 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45  gets freed..*/.E
17d0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
17e0: 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70  (int op, Expr *p
17f0: 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67  Left, Expr *pRig
1800: 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  ht, const Token 
1810: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
1820: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
1830: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
1840: 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20  izeof(Expr) );. 
1850: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1860: 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c      /* When mall
1870: 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65 74 65  oc fails, delete
1880: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
1890: 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20 70  t. Expressions p
18a0: 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20 2a 2a  assed to .    **
18b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
18c0: 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 61 6c  ust always be al
18d0: 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73 71 6c  located with sql
18e0: 69 74 65 33 45 78 70 72 28 29 20 66 6f 72 20 74  ite3Expr() for t
18f0: 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65 61 73  his .    ** reas
1900: 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on. .    */.    
1910: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1920: 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  e(pLeft);.    sq
1930: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1940: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
1950: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
1960: 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 4e  w->op = op;.  pN
1970: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ew->pLeft = pLef
1980: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  t;.  pNew->pRigh
1990: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 70 4e  t = pRight;.  pN
19a0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
19b0: 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20   if( pToken ){. 
19c0: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65     assert( pToke
19d0: 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20  n->dyn==0 );.   
19e0: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
19f0: 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f  ew->token = *pTo
1a00: 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ken;.  }else if(
1a10: 20 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74   pLeft && pRight
1a20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1a30: 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70  xprSpan(pNew, &p
1a40: 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69  Left->span, &pRi
1a50: 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 0a  ght->span);.  }.
1a60: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1a70: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69  ../*.** When doi
1a80: 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73  ng a nested pars
1a90: 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75  e, you can inclu
1aa0: 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65  de terms in an e
1ab0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61  xpression.** tha
1ac0: 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73  t look like this
1ad0: 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e 2e  :   #0 #1 #2 ...
1ae0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65    These terms re
1af0: 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a  fer to elements.
1b00: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ** on the stack.
1b10: 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74 68 65    "#0" means the
1b20: 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
1b30: 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73  k..** "#1" means
1b40: 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f   the next down o
1b50: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 41 6e  n the stack.  An
1b60: 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a  d so forth..**.*
1b70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b80: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1b90: 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c 20 77  parser to deal w
1ba0: 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73 65 20  ith on of those 
1bb0: 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69 6d 6d  terms..** It imm
1bc0: 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72 61 74  ediately generat
1bd0: 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f 72 65  es code to store
1be0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 61 20   the value in a 
1bf0: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e  memory location.
1c00: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 73 20  .** The returns 
1c10: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
1c20: 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74 6f 20  at will code to 
1c30: 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  extract the valu
1c40: 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74 20 6d  e from.** that m
1c50: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 61  emory location a
1c60: 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45 78 70  s needed..*/.Exp
1c70: 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69 73 74  r *sqlite3Regist
1c80: 65 72 45 78 70 72 28 50 61 72 73 65 20 2a 70 50  erExpr(Parse *pP
1c90: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
1ca0: 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ken){.  Vdbe *v 
1cb0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1cc0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 6e  .  Expr *p;.  in
1cd0: 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28 20 76  t depth;.  if( v
1ce0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1cf0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
1d00: 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
1d10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1d20: 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22 25  Parse, "near \"%
1d30: 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  T\": syntax erro
1d40: 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 20  r", pToken);.   
1d50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d60: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
1d70: 28 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c  (TK_REGISTER, 0,
1d80: 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69   0, pToken);.  i
1d90: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( p==0 ){.    r
1da0: 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 61 6c  eturn 0;  /* Mal
1db0: 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
1dc0: 7d 0a 20 20 64 65 70 74 68 20 3d 20 61 74 6f 69  }.  depth = atoi
1dd0: 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b  (&pToken->z[1]);
1de0: 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70  .  p->iTable = p
1df0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
1e00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e10: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64 65 70  p(v, OP_Dup, dep
1e20: 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  th, 0);.  sqlite
1e30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1e40: 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e 69 54  _MemStore, p->iT
1e50: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65 74 75  able, 1);.  retu
1e60: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  rn p;.}../*.** J
1e70: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
1e80: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
1e90: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
1ea0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
1eb0: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
1ec0: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
1ed0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
1ee0: 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  on..*/.Expr *sql
1ef0: 69 74 65 33 45 78 70 72 41 6e 64 28 45 78 70 72  ite3ExprAnd(Expr
1f00: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
1f10: 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c  Right){.  if( pL
1f20: 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  eft==0 ){.    re
1f30: 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d  turn pRight;.  }
1f40: 65 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 3d  else if( pRight=
1f50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f60: 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b   pLeft;.  }else{
1f70: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
1f80: 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  te3Expr(TK_AND, 
1f90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
1fa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1fb0: 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70 61  Set the Expr.spa
1fc0: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
1fd0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
1fe0: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
1ff0: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
2000: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
2010: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2020: 33 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a  3ExprSpan(Expr *
2030: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c  pExpr, Token *pL
2040: 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67  eft, Token *pRig
2050: 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ht){.  assert( p
2060: 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73  Right!=0 );.  as
2070: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
2080: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
2090: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 26  _malloc_failed &
20a0: 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70  & pRight->z && p
20b0: 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 61  Left->z ){.    a
20c0: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 64 79  ssert( pLeft->dy
20d0: 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d 3e 7a  n==0 || pLeft->z
20e0: 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20 29 3b  [pLeft->n]==0 );
20f0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
2100: 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67 68 74  dyn==0 && pRight
2110: 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ->dyn==0 ){.    
2120: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20    pExpr->span.z 
2130: 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20  = pLeft->z;.    
2140: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20    pExpr->span.n 
2150: 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 28 70  = pRight->n + (p
2160: 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65 66 74  Right->z - pLeft
2170: 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
2180: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
2190: 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  an.z = 0;.    }.
21a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
21b0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
21c0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
21d0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
21e0: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
21f0: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
2200: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
2210: 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70  tion(ExprList *p
2220: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
2230: 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  ken){.  Expr *pN
2240: 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  ew;.  pNew = sql
2250: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
2260: 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28  f(Expr) );.  if(
2270: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
2280: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2290: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2a  elete(pList); /*
22a0: 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d   Avoid leaking m
22b0: 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f  emory when mallo
22c0: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
22d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
22e0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e  New->op = TK_FUN
22f0: 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70  CTION;.  pNew->p
2300: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
2310: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
2320: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
2330: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
2340: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
2350: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Token;.  }else{.
2360: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
2370: 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  z = 0;.  }.  pNe
2380: 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e  w->span = pNew->
2390: 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20  token;.  return 
23a0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
23b0: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
23c0: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
23d0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
23e0: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
23f0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
2400: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
2410: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
2420: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
2430: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
2440: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
2450: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
2460: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
2470: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
2480: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
2490: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
24a0: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
24b0: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
24c0: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
24d0: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
24e0: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
24f0: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
2500: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
2510: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
2520: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
2530: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
2540: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
2550: 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22  form ":aaa" or "
2560: 24 61 61 61 22 20 61 72 65 20 61 73 73 69 67 6e  $aaa" are assign
2570: 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ed the same numb
2580: 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65  er.** as the pre
2590: 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f  vious instance o
25a0: 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63  f the same wildc
25b0: 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73  ard.  Or if this
25c0: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
25d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
25e0: 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e   wildcard, the n
25f0: 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20 76 61  ext sequenial va
2600: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73  riable number is
2610: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f  .** assigned..*/
2620: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2630: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
2640: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2650: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2660: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20  Token *pToken;. 
2670: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
2680: 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e  return;.  pToken
2690: 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e   = &pExpr->token
26a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
26b0: 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  en->n>=1 );.  as
26c0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21  sert( pToken->z!
26d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26e0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20  pToken->z[0]!=0 
26f0: 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d  );.  if( pToken-
2700: 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  >n==1 ){.    /* 
2710: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
2720: 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67  form "?".  Assig
2730: 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61  n the next varia
2740: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
2750: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2760: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  = ++pParse->nVar
2770: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
2780: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20  oken->z[0]=='?' 
2790: 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  ){.    /* Wildca
27a0: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
27b0: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
27c0: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
27d0: 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75  ger and.    ** u
27e0: 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61 72  se it as the var
27f0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2800: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70      int i;.    p
2810: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Expr->iTable = i
2820: 20 3d 20 61 74 6f 69 28 26 70 54 6f 6b 65 6e 2d   = atoi(&pToken-
2830: 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  >z[1]);.    if( 
2840: 69 3c 31 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f  i<1 || i>SQLITE_
2850: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
2860: 42 45 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  BER ){.      sql
2870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2880: 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e  rse, "variable n
2890: 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62 65  umber must be be
28a0: 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64  tween ?1 and ?%d
28b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  ",.          SQL
28c0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
28d0: 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a  _NUMBER);.    }.
28e0: 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65      if( i>pParse
28f0: 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20  ->nVar ){.      
2900: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69  pParse->nVar = i
2910: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2920: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
2930: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a  s of the form ":
2940: 61 61 61 22 20 6f 72 20 22 24 61 61 61 22 2e 20  aaa" or "$aaa". 
2950: 20 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   Reuse the same 
2960: 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
2970: 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72  number as the pr
2980: 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f  ior appearance o
2990: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c  f the same name,
29a0: 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a   or if the name.
29b0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
29c0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
29d0: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
29e0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
29f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
2a00: 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54  i, n;.    n = pT
2a10: 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72  oken->n;.    for
2a20: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
2a30: 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  nVarExpr; i++){.
2a40: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a        Expr *pE;.
2a50: 20 20 20 20 20 20 69 66 28 20 28 70 45 20 3d 20        if( (pE = 
2a60: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2a70: 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20 20 20  r[i])!=0.       
2a80: 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e     && pE->token.
2a90: 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20 20 26  n==n.          &
2aa0: 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b  & memcmp(pE->tok
2ab0: 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c  en.z, pToken->z,
2ac0: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
2ad0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2ae0: 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pE->iTable;.  
2af0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2b10: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56  f( i>=pParse->nV
2b20: 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  arExpr ){.      
2b30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2b40: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  ++pParse->nVar;.
2b50: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
2b60: 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50 61 72  ->nVarExpr>=pPar
2b70: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
2b80: 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  c-1 ){.        p
2b90: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41  Parse->nVarExprA
2ba0: 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e  lloc += pParse->
2bb0: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20  nVarExprAlloc + 
2bc0: 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  10;.        pPar
2bd0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20 3d 20  se->apVarExpr = 
2be0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50  sqliteRealloc(pP
2bf0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 2c  arse->apVarExpr,
2c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c10: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2c20: 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69  nVarExprAlloc*si
2c30: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 70 56  zeof(pParse->apV
2c40: 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20  arExpr[0]) );.  
2c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2c60: 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f  !sqlite3_malloc_
2c70: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
2c80: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2c90: 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30 20 29  ->apVarExpr!=0 )
2ca0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
2cb0: 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50 61 72  ->apVarExpr[pPar
2cc0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20  se->nVarExpr++] 
2cd0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
2ce0: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f  .    }.  } .}../
2cf0: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
2d00: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
2d10: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76  ssion tree..*/.v
2d20: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 44  oid sqlite3ExprD
2d30: 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a  elete(Expr *p){.
2d40: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2d50: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70  urn;.  if( p->sp
2d60: 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  an.dyn ) sqliteF
2d70: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70  ree((char*)p->sp
2d80: 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  an.z);.  if( p->
2d90: 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69  token.dyn ) sqli
2da0: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d  teFree((char*)p-
2db0: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c  >token.z);.  sql
2dc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
2dd0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69  ->pLeft);.  sqli
2de0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
2df0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69  >pRight);.  sqli
2e00: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2e10: 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73  e(p->pList);.  s
2e20: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2e30: 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  te(p->pSelect);.
2e40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
2e50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
2e60: 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f  ollowing group o
2e70: 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20  f routines make 
2e80: 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65  deep copies of e
2e90: 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65  xpressions,.** e
2ea0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c  xpression lists,
2eb0: 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73   ID lists, and s
2ec0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
2ed0: 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63 61  .  The copies ca
2ee0: 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20  n.** be deleted 
2ef0: 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65 64  (by being passed
2f00: 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65 63   to their respec
2f10: 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29  tive ...Delete()
2f20: 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69   routines).** wi
2f30: 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20  thout effecting 
2f40: 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a  the originals..*
2f50: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
2f60: 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e  ion list, ID, an
2f70: 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72  d source lists r
2f80: 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33  eturn by sqlite3
2f90: 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a  ExprListDup(),.*
2fa0: 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  * sqlite3IdListD
2fb0: 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65  up(), and sqlite
2fc0: 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63 61  3SrcListDup() ca
2fd0: 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72  n not be further
2fe0: 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79   expanded .** by
2ff0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
3000: 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74  s to sqlite*List
3010: 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65  Append() routine
3020: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62  s..**.** Any tab
3030: 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72 63  les that the Src
3040: 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74  List might point
3050: 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c   to are not dupl
3060: 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  icated..*/.Expr 
3070: 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28  *sqlite3ExprDup(
3080: 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72  Expr *p){.  Expr
3090: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
30a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
30b0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
30c0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
30d0: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
30e0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
30f0: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20  .  memcpy(pNew, 
3100: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  p, sizeof(*pNew)
3110: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
3120: 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e  n.z!=0 ){.    pN
3130: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 73 71  ew->token.z = sq
3140: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 2d 3e 74  liteStrNDup(p->t
3150: 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.z, p->token
3160: 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  .n);.    pNew->t
3170: 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20  oken.dyn = 1;.  
3180: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
3190: 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a  t( pNew->token.z
31a0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  ==0 );.  }.  pNe
31b0: 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20  w->span.z = 0;. 
31c0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73   pNew->pLeft = s
31d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
31e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d  >pLeft);.  pNew-
31f0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
3200: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 52 69 67  3ExprDup(p->pRig
3210: 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ht);.  pNew->pLi
3220: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
3230: 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74  ListDup(p->pList
3240: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65  );.  pNew->pSele
3250: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
3260: 63 74 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74  ctDup(p->pSelect
3270: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 54 61 62 20  );.  pNew->pTab 
3280: 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20 72 65 74  = p->pTab;.  ret
3290: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64  urn pNew;.}.void
32a0: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
32b0: 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f  y(Token *pTo, To
32c0: 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ken *pFrom){.  i
32d0: 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71  f( pTo->dyn ) sq
32e0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
32f0: 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70  pTo->z);.  if( p
3300: 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  From->z ){.    p
3310: 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e  To->n = pFrom->n
3320: 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73  ;.    pTo->z = s
3330: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46 72  qliteStrNDup(pFr
3340: 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29  om->z, pFrom->n)
3350: 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d  ;.    pTo->dyn =
3360: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3370: 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d   pTo->z = 0;.  }
3380: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
3390: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
33a0: 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20  ExprList *p){.  
33b0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
33c0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
33d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
33e0: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
33f0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
3400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3410: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3420: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
3430: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3440: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3450: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77  ew->nExpr = pNew
3460: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45  ->nAlloc = p->nE
3470: 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  xpr;.  pNew->a =
3480: 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d   pItem = sqliteM
3490: 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a  alloc( p->nExpr*
34a0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
34b0: 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d  );.  if( pItem==
34c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  0 ){.    sqliteF
34d0: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72  ree(pNew);.    r
34e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
34f0: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
3500: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
3510: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
3520: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
3530: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
3540: 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72  wExpr, *pOldExpr
3550: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
3560: 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20  pr = pNewExpr = 
3570: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3580: 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74  OldExpr = pOldIt
3590: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
35a0: 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70  if( pOldExpr->sp
35b0: 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45  an.z!=0 && pNewE
35c0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  xpr ){.      /* 
35d0: 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f  Always make a co
35e0: 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66  py of the span f
35f0: 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70  or top-level exp
3600: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a  ressions in the.
3610: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
3620: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c  ion list.  The l
3630: 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70  ogic in SELECT p
3640: 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 64  rocessing that d
3650: 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20  etermines.      
3660: 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** the names of 
3670: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
3680: 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20  esult set needs 
3690: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
36a0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
36b0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77  3TokenCopy(&pNew
36c0: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c  Expr->span, &pOl
36d0: 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  dExpr->span);.  
36e0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
36f0: 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70  pNewExpr==0 || p
3700: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21  NewExpr->span.z!
3710: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0 .            
3720: 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  || pOldExpr->spa
3730: 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  n.z==0 || sqlite
3740: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
3750: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
3760: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
3770: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  up(pOldItem->zNa
3780: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
3790: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64  sortOrder = pOld
37a0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
37b0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67  .    pItem->isAg
37c0: 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73  g = pOldItem->is
37d0: 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Agg;.    pItem->
37e0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
37f0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
3800: 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73  /*.** If cursors
3810: 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77  , triggers, view
3820: 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  s and subqueries
3830: 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64   are all omitted
3840: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69   from.** the bui
3850: 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66  ld, then none of
3860: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
3870: 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20  outines, except 
3880: 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53  for .** sqlite3S
3890: 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20  electDup(), can 
38a0: 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74  be called. sqlit
38b0: 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73  e3SelectDup() is
38c0: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61   sometimes.** ca
38d0: 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c  lled with a NULL
38e0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
38f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3900: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
3910: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3920: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a  OMIT_TRIGGER) \.
3930: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
3940: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
3950: 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  Y).SrcList *sqli
3960: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 53 72  te3SrcListDup(Sr
3970: 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72 63  cList *p){.  Src
3980: 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  List *pNew;.  in
3990: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  t i;.  int nByte
39a0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
39b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65  eturn 0;.  nByte
39c0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20   = sizeof(*p) + 
39d0: 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a  (p->nSrc>0 ? siz
39e0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28  eof(p->a[0]) * (
39f0: 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b  p->nSrc-1) : 0);
3a00: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3a10: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74 65  MallocRaw( nByte
3a20: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3a30: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3a40: 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65  pNew->nSrc = pNe
3a50: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
3a60: 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Src;.  for(i=0; 
3a70: 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  i<p->nSrc; i++){
3a80: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
3a90: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
3aa0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
3ab0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  ;.    struct Src
3ac0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
3ad0: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
3ae0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
3af0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
3b00: 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
3b10: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3b20: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
3b30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
3b40: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
3b50: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
3b60: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3b70: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
3b80: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
3b90: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
3ba0: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
3bb0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
3bc0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
3bd0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
3be0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
3bf0: 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65  ;.    pTab = pNe
3c00: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
3c10: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
3c20: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
3c30: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
3c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
3c50: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Item->pSelect = 
3c60: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
3c70: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65  (pOldItem->pSele
3c80: 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ct);.    pNewIte
3c90: 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33  m->pOn = sqlite3
3ca0: 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  ExprDup(pOldItem
3cb0: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77  ->pOn);.    pNew
3cc0: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73  Item->pUsing = s
3cd0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
3ce0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
3cf0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3d00: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
3d10: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
3d20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3d30: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
3d40: 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69  e3IdListDup(IdLi
3d50: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
3d60: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
3d70: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
3d80: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
3d90: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3da0: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
3db0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
3dc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
3dd0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d  New->nId = pNew-
3de0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64  >nAlloc = p->nId
3df0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
3e00: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
3e10: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
3e20: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
3e30: 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  New->a==0 ){.   
3e40: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77   sqliteFree(pNew
3e50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3e60: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
3e70: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
3e80: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
3e90: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
3ea0: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
3eb0: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
3ec0: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
3ed0: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
3ee0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
3ef0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
3f00: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
3f10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3f20: 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  idx = pOldItem->
3f30: 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  idx;.  }.  retur
3f40: 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74  n pNew;.}.Select
3f50: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
3f60: 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  up(Select *p){. 
3f70: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
3f80: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3f90: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3fa0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3fb0: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
3fc0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3fd0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
3fe0: 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
3ff0: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e  isDistinct;.  pN
4000: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
4010: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4020: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e  p->pEList);.  pN
4030: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
4040: 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e  e3SrcListDup(p->
4050: 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  pSrc);.  pNew->p
4060: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
4070: 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65  xprDup(p->pWhere
4080: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
4090: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
40a0: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f  rListDup(p->pGro
40b0: 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  upBy);.  pNew->p
40c0: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
40d0: 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69  ExprDup(p->pHavi
40e0: 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ng);.  pNew->pOr
40f0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
4100: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f  xprListDup(p->pO
4110: 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d  rderBy);.  pNew-
4120: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
4130: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71  New->pPrior = sq
4140: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
4150: 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65  ->pPrior);.  pNe
4160: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
4170: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c  te3ExprDup(p->pL
4180: 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  imit);.  pNew->p
4190: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
41a0: 45 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73  ExprDup(p->pOffs
41b0: 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  et);.  pNew->iLi
41c0: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
41d0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
41e0: 20 20 70 4e 65 77 2d 3e 70 70 4f 70 65 6e 56 69    pNew->ppOpenVi
41f0: 72 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 4e 65  rtual = 0;.  pNe
4200: 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20  w->isResolved = 
4210: 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20  p->isResolved;. 
4220: 20 70 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20 70   pNew->isAgg = p
4230: 2d 3e 69 73 41 67 67 3b 0a 20 20 72 65 74 75 72  ->isAgg;.  retur
4240: 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a  n pNew;.}.#else.
4250: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
4260: 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74 20  electDup(Select 
4270: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
4280: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
4290: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  0;.}.#endif.../*
42a0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
42b0: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  ement to the end
42c0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
42d0: 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73  n list.  If pLis
42e0: 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c  t is.** initiall
42f0: 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65  y NULL, then cre
4300: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
4310: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78  sion list..*/.Ex
4320: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
4330: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78  xprListAppend(Ex
4340: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45  prList *pList, E
4350: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
4360: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28  n *pName){.  if(
4370: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
4380: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
4390: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
43a0: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
43b0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
43c0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
43d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
43e0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rt( pList->nAllo
43f0: 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66  c==0 );.  }.  if
4400: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c  ( pList->nAlloc<
4410: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  =pList->nExpr ){
4420: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
4430: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
4440: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 2d    int n = pList-
4450: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
4460: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
4470: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 6e  lloc(pList->a, n
4480: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
4490: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
44a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
44b0: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
44c0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
44d0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
44e0: 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 61  loc = n;.  }.  a
44f0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
4500: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  =0 );.  if( pExp
4510: 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20  r || pName ){.  
4520: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
4530: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
4540: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
4550: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
4560: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
4570: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
4580: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
4590: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
45a0: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
45b0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
45c0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
45d0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
45e0: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
45f0: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
4600: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
4610: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
4620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4630: 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20 73 71  ete(pExpr);.  sq
4640: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
4650: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65  ete(pList);.  re
4660: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4670: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
4680: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
4690: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
46a0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
46b0: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
46c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
46d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
46e0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
46f0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
4700: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
4710: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
4720: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
4730: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
4740: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
4750: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
4760: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
4770: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
4780: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
4790: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
47a0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
47b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
47c0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
47d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
47e0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
47f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
4800: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
4810: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
4820: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
4830: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
4840: 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65  Call xFunc for e
4850: 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64  ach node visited
4860: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
4870: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46  rn value from xF
4880: 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77  unc determines w
4890: 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20  hether the tree 
48a0: 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  walk continues..
48b0: 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69  ** 0 means conti
48c0: 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  nue walking the 
48d0: 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64  tree.  1 means d
48e0: 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64  o not walk child
48f0: 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75  ren.** of the cu
4900: 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63  rrent node but c
4910: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62  ontinue with sib
4920: 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20  lings.  2 means 
4930: 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74  abandon.** the t
4940: 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74  ree walk complet
4950: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ely..**.** The r
4960: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
4970: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4980: 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68   1 to abandon th
4990: 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61  e tree walk.** a
49a0: 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  nd 0 to continue
49b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
49c0: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70  walkExprList(Exp
49d0: 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28 2a 29  rList *, int (*)
49e0: 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c  (void *, Expr*),
49f0: 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63   void *);.static
4a00: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54 72 65   int walkExprTre
4a10: 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  e(Expr *pExpr, i
4a20: 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64  nt (*xFunc)(void
4a30: 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  *,Expr*), void *
4a40: 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pArg){.  int rc;
4a50: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
4a60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
4a70: 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67   = (*xFunc)(pArg
4a80: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
4a90: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
4aa0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45   walkExprTree(pE
4ab0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e  xpr->pLeft, xFun
4ac0: 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72  c, pArg) ) retur
4ad0: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c  n 1;.    if( wal
4ae0: 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2d  kExprTree(pExpr-
4af0: 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20  >pRight, xFunc, 
4b00: 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31  pArg) ) return 1
4b10: 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78  ;.    if( walkEx
4b20: 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c  prList(pExpr->pL
4b30: 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ist, xFunc, pArg
4b40: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
4b50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e 31 3b  }.  return rc>1;
4b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77  .}../*.** Call w
4b70: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f  alkExprTree() fo
4b80: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
4b90: 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a 2a 2f  on in list p..*/
4ba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
4bb0: 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
4bc0: 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75 6e  t *p, int (*xFun
4bd0: 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  c)(void *, Expr*
4be0: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
4bf0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
4c00: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
4c10: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 21 70  *pItem;.  if( !p
4c20: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
4c30: 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c 20 70  or(i=p->nExpr, p
4c40: 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30 3b 20  Item=p->a; i>0; 
4c50: 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
4c60: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
4c70: 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ree(pItem->pExpr
4c80: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
4c90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4ca0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4cb0: 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70  .** Call walkExp
4cc0: 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72  rTree() for ever
4cd0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
4ce0: 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20 69 6e  Select p, not in
4cf0: 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65  cluding.** expre
4d00: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
4d10: 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65 6c 65  part of sub-sele
4d20: 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f 4d 20  cts in any FROM 
4d30: 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20 4c 49  clause or the LI
4d40: 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53 45 54  MIT.** or OFFSET
4d50: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e 0a 2a   expressions...*
4d60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c  /.static int wal
4d70: 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65 6c 65  kSelectExpr(Sele
4d80: 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46 75  ct *p, int (*xFu
4d90: 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72  nc)(void *, Expr
4da0: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
4db0: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
4dc0: 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75 6e 63  p->pEList, xFunc
4dd0: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
4de0: 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68 65 72  xprTree(p->pWher
4df0: 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  e, xFunc, pArg);
4e00: 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28  .  walkExprList(
4e10: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78 46 75  p->pGroupBy, xFu
4e20: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
4e30: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 48 61  kExprTree(p->pHa
4e40: 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70 41 72  ving, xFunc, pAr
4e50: 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69  g);.  walkExprLi
4e60: 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  st(p->pOrderBy, 
4e70: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
4e80: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
4e90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4ea0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20   is designed as 
4eb0: 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
4ec0: 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a  kExprTree()..**.
4ed0: 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c  ** pArg is reall
4ee0: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
4ef0: 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77  n integer.  If w
4f00: 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f  e can tell by lo
4f10: 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70  oking.** at pExp
4f20: 72 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  r that the expre
4f30: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
4f40: 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74  ins pExpr is not
4f50: 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65   a constant.** e
4f60: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
4f70: 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61  set *pArg to 0 a
4f80: 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61  nd return 2 to a
4f90: 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20  bandon the tree 
4fa0: 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70  walk..** If pExp
4fb0: 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20  r does does not 
4fc0: 64 69 73 71 75 61 6c 69 66 79 20 74 68 65 20 65  disqualify the e
4fd0: 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62  xpression from b
4fe0: 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a  eing a constant.
4ff0: 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  ** then do nothi
5000: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ng..**.** After 
5010: 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c  walking the whol
5020: 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f  e tree, if no no
5030: 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68  des are found th
5040: 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a  at disqualify.**
5050: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5060: 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65  as constant, the
5070: 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20  n we assume the 
5080: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
5090: 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  .** is constant.
50a0: 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
50b0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f  rIsConstant() fo
50c0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
50d0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
50e0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
50f0: 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20  IsConstant(void 
5100: 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
5110: 70 72 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  pr){.  switch( p
5120: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
5130: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
5140: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
5150: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
5160: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
5170: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
5180: 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a 2f 0a  and *pArg==2 */.
5190: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
51a0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
51b0: 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 3d 3d 32  *((int*)pArg)==2
51c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
51d0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
51e0: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
51f0: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
5200: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
5210: 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63  se TK_DOT:.    c
5220: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
5230: 49 4f 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ION:.#ifndef SQL
5240: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5250: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
5260: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
5270: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
5280: 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70  .      *((int*)p
5290: 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20  Arg) = 0;.      
52a0: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 64 65  return 2;.    de
52b0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
52c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
52d0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
52e0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
52f0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
5300: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
5310: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
5320: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
5330: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
5340: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
5350: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
5360: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
5370: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
5380: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
5390: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
53a0: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
53b0: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
53c0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
53d0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
53e0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
53f0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
5400: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
5410: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
5420: 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 1;.  walkExprT
5430: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
5440: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
5450: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
5460: 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sConst;.}../*.**
5470: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
5480: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
5490: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
54a0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
54b0: 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
54c0: 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
54d0: 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
54e0: 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
54f0: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
5500: 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
5510: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
5520: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
5530: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
5540: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
5550: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
5560: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
5570: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
5580: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
5590: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
55a0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
55b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
55c0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
55d0: 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a  ction(Expr *p){.
55e0: 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20    int isConst = 
55f0: 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  2;.  walkExprTre
5600: 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43  e(p, exprNodeIsC
5610: 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73  onstant, &isCons
5620: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43  t);.  return isC
5630: 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  onst!=0;.}../*.*
5640: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
5650: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
5660: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
5670: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
5680: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
5690: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
56a0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
56b0: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
56c0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
56d0: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
56e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
56f0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
5700: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
5710: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
5720: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
5730: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
5740: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
5750: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
5760: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5770: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
5780: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
5790: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d  e){.  switch( p-
57a0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
57b0: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
57c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
57d0: 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65 6e  etInt32(p->token
57e0: 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20  .z, pValue) ){. 
57f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5820: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
5830: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
5840: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
5850: 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61  er(p->pLeft, pVa
5860: 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lue);.    }.    
5870: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
5880: 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20  {.      int v;. 
5890: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
58a0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
58b0: 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20  >pLeft, &v) ){. 
58c0: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
58d0: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74   -v;.        ret
58e0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
58f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5900: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
5910: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
5920: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
5930: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
5940: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69  e given string i
5950: 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d  s a row-id colum
5960: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  n name..*/.int s
5970: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f  qlite3IsRowid(co
5980: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
5990: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
59a0: 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29  mp(z, "_ROWID_")
59b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
59c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
59d0: 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29  ICmp(z, "ROWID")
59e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
59f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5a00: 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d  ICmp(z, "OID")==
5a10: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
5a20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
5a30: 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d  ** Given the nam
5a40: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  e of a column of
5a50: 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20   the form X.Y.Z 
5a60: 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a  or Y.Z or just Z
5a70: 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61  , look up.** tha
5a80: 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65  t name in the se
5a90: 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c  t of source tabl
5aa0: 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61  es in pSrcList a
5ab0: 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70  nd make the pExp
5ac0: 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  r .** expression
5ad0: 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b   node refer back
5ae0: 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20   to that source 
5af0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c  column.  The fol
5b00: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a  lowing changes.*
5b10: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45  * are made to pE
5b20: 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45  xpr:.**.**    pE
5b30: 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20  xpr->iDb        
5b40: 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65 78     Set the index
5b50: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66   in db->aDb[] of
5b60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5b70: 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  lding.**        
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   the table..**  
5ba0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
5bb0: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
5bc0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
5bd0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62  for the table ob
5be0: 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20  tained.**       
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e    from pSrcList.
5c10: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .**    pExpr->iC
5c20: 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20  olumn       Set 
5c30: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  to the column nu
5c40: 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65 20  mber within the 
5c50: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
5c60: 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
5c70: 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55    Set to TK_COLU
5c80: 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  MN..**    pExpr-
5c90: 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20 41  >pLeft         A
5ca0: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
5cb0: 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20  is points to is 
5cc0: 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45  deleted.**    pE
5cd0: 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20  xpr->pRight     
5ce0: 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f     Any expressio
5cf0: 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f  n this points to
5d00: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
5d10: 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20  ** The pDbToken 
5d20: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
5d30: 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68 65  he database (the
5d40: 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c   "X").  This val
5d50: 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c  ue may be.** NUL
5d60: 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  L meaning that n
5d70: 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ame is of the fo
5d80: 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e  rm Y.Z or Z.  An
5d90: 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61  y available data
5da0: 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75  base.** can be u
5db0: 73 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65  sed.  The pTable
5dc0: 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d  Token is the nam
5dd0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28  e of the table (
5de0: 74 68 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a  the "Y").  This.
5df0: 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  ** value can be 
5e00: 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e  NULL if pDbToken
5e10: 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20   is also NULL.  
5e20: 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69  If pTableToken i
5e30: 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61  s NULL it.** mea
5e40: 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d  ns that the form
5e50: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
5e60: 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d  Z and that colum
5e70: 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c  ns from any tabl
5e80: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  e.** can be used
5e90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
5ea0: 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  ame cannot be re
5eb0: 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f  solved unambiguo
5ec0: 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65  usly, leave an e
5ed0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
5ee0: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
5ef0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  turn non-zero.  
5f00: 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73  Return zero on s
5f10: 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  uccess..*/.stati
5f20: 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65  c int lookupName
5f30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5f40: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
5f50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
5f60: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f  /.  Token *pDbTo
5f70: 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ken,     /* Name
5f80: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
5f90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
5fa0: 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
5fb0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b  Token *pTableTok
5fc0: 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  en,  /* Name of 
5fd0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
5fe0: 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c   column, or NULL
5ff0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
6000: 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61  lumnToken, /* Na
6010: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
6020: 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
6030: 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54  xt *pNC,    /* T
6040: 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20  he name context 
6050: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
6060: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  the name */.  Ex
6070: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
6080: 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20     /* Make this 
6090: 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20  EXPR node point 
60a0: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  to the selected 
60b0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63  column */.){.  c
60c0: 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20  har *zDb = 0;   
60d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
60e0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
60f0: 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a  e "X" in X.Y.Z *
6100: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  /.  char *zTab =
6110: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   0;      /* Name
6120: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
6130: 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a  The "Y" in X.Y.Z
6140: 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61   or Y.Z */.  cha
6150: 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20  r *zCol = 0;    
6160: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
6170: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a   column.  The "Z
6180: 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  " */.  int i, j;
6190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
61a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
61b0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20    int cnt = 0;  
61c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
61d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
61e0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
61f0: 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20  nt cntTab = 0;  
6200: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6210: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
6220: 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  names */.  sqlit
6230: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6240: 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  >db;  /* The dat
6250: 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  abase */.  struc
6260: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
6270: 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  pItem;       /* 
6280: 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  Use for looping 
6290: 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 69 74  over pSrcList it
62a0: 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ems */.  struct 
62b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d  SrcList_item *pM
62c0: 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68  atch = 0;  /* Th
62d0: 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c  e matching pSrcL
62e0: 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61  ist item */.  Na
62f0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e  meContext *pTopN
6300: 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20  C = pNC;        
6310: 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e  /* First namecon
6320: 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74  text in the list
6330: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
6340: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70  ColumnToken && p
6350: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29  ColumnToken->z )
6360: 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e  ; /* The Z in X.
6370: 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  Y.Z cannot be NU
6380: 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71  LL */.  zDb = sq
6390: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
63a0: 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20  en(pDbToken);.  
63b0: 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61  zTab = sqlite3Na
63c0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62  meFromToken(pTab
63d0: 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c  leToken);.  zCol
63e0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
63f0: 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54  omToken(pColumnT
6400: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  oken);.  if( sql
6410: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
6420: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c  ed ){.    goto l
6430: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20  ookupname_end;. 
6440: 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61   }..  pExpr->iTa
6450: 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c  ble = -1;.  whil
6460: 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30  e( pNC && cnt==0
6470: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
6480: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
6490: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 45  >pSrcList;.    E
64a0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
64b0: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 0a 0a  = pNC->pEList;..
64c0: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 7a      /* assert( z
64d0: 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  Tab==0 || pEList
64e0: 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69 66  ==0 ); */.    if
64f0: 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
6500: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
6510: 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20  em=pSrcList->a; 
6520: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
6530: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
6540: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
6550: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
6560: 61 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75  ab;.        Colu
6570: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20  mn *pCol;.  .   
6580: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
6590: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
65a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
65b0: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  b->nCol>0 );.   
65c0: 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b       if( zTab ){
65d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
65e0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
6600: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74   *zTabName = pIt
6610: 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
6620: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6630: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e  te3StrICmp(zTabN
6640: 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20  ame, zTab)!=0 ) 
6650: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6660: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6670: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
6680: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
6690: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
66a0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
66b0: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
66c0: 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61  mp(zTabName, zTa
66d0: 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  b)!=0 ) continue
66e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
66f0: 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69  ( zDb!=0 && sqli
6700: 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61  te3StrICmp(db->a
6710: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
6720: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
6740: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6750: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6760: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6770: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
6780: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ab++) ){.       
6790: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
67a0: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
67b0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  r;.          pEx
67c0: 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e  pr->iDb = pTab->
67d0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  iDb;.          p
67e0: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
67f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6800: 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70   for(j=0, pCol=p
6810: 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
6820: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43  b->nCol; j++, pC
6830: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
6840: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6850: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
6860: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
6870: 20 20 20 20 20 20 20 20 20 49 64 4c 69 73 74 20           IdList 
6880: 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20  *pUsing;.       
6890: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
68a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
68b0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
68c0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
68d0: 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74      pMatch = pIt
68e0: 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
68f0: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
6900: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20  b->iDb;.        
6910: 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
6920: 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c  e the rowid (col
6930: 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20  umn -1) for the 
6940: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
6950: 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  KEY */.         
6960: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
6970: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
6980: 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20  ey ? -1 : j;.   
6990: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
69a0: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
69b0: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
69c0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
69d0: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54  Expr->pColl = pT
69e0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c  ab->aCol[j].pCol
69f0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  l;.            i
6a00: 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  f( pItem->jointy
6a10: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
6a20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6a30: 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63   /* If this matc
6a40: 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68  h occurred in th
6a50: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20  e left table of 
6a60: 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a  a natural join,.
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
6a80: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 72   then skip the r
6a90: 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20 61 76  ight table to av
6aa0: 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20  oid a duplicate 
6ab0: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
6ac0: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b                i+
6ae0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
6af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6b00: 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d   (pUsing = pItem
6b10: 2d 3e 70 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a  ->pUsing)!=0 ){.
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6b30: 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f   If this match o
6b40: 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d  ccurs on a colum
6b50: 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  n that is in the
6b60: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20   USING clause.  
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
6b80: 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74  f a join, skip t
6b90: 68 65 20 73 65 61 72 63 68 20 6f 66 20 74 68 65  he search of the
6ba0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
6bb0: 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20  the join.       
6bc0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f         ** to avo
6bd0: 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d  id a duplicate m
6be0: 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20  atch there. */. 
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
6c00: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
6c10: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73    for(k=0; k<pUs
6c20: 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a  ing->nId; k++){.
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c40: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
6c50: 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e  mp(pUsing->a[k].
6c60: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
6c70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6c80: 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20       pItem++;.  
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
6cb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6cf0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6d00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6d20: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
6d30: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
6d40: 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68  R.    /* If we h
6d50: 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ave not already 
6d60: 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d  resolved the nam
6d70: 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20  e, then maybe . 
6d80: 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65     ** it is a ne
6d90: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69  w.* or old.* tri
6da0: 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65  gger argument re
6db0: 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20  ference.    */. 
6dc0: 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26     if( zDb==0 &&
6dd0: 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d   zTab!=0 && cnt=
6de0: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72  =0 && pParse->tr
6df0: 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20  igStack!=0 ){.  
6e00: 20 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b      TriggerStack
6e10: 20 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20   *pTriggerStack 
6e20: 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  = pParse->trigSt
6e30: 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  ack;.      Table
6e40: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
6e50: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
6e60: 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d  ack->newIdx != -
6e70: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
6e80: 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29  Cmp("new", zTab)
6e90: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
6ea0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6eb0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
6ec0: 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20  newIdx;.        
6ed0: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
6ee0: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
6ef0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
6f00: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
6f10: 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  b;.      }else i
6f20: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
6f30: 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26  ->oldIdx != -1 &
6f40: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
6f50: 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30  ("old", zTab)==0
6f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
6f70: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
6f80: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
6f90: 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  x;.        asser
6fa0: 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  t( pTriggerStack
6fb0: 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ->pTab );.      
6fc0: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
6fd0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
6fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
6ff0: 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20   pTab ){ .      
7000: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
7010: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
7020: 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20  pTab->aCol;..   
7030: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20       pExpr->iDb 
7040: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
7050: 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20       cntTab++;. 
7060: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
7070: 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  j < pTab->nCol; 
7080: 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20  j++, pCol++) {. 
7090: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
70a0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
70b0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ->zName, zCol)==
70c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
70d0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
70e0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
70f0: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
7100: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
7110: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7120: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
7130: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
7140: 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty;.            
7150: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
7160: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
7170: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
7180: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54  pExpr->pTab = pT
7190: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
71a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
71b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
71c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
71d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
71e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
71f0: 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  R) */..    /*.  
7200: 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65    ** Perhaps the
7210: 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72   name is a refer
7220: 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49  ence to the ROWI
7230: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  D.    */.    if(
7240: 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61   cnt==0 && cntTa
7250: 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49  b==1 && sqlite3I
7260: 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a  sRowid(zCol) ){.
7270: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
7280: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7290: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
72a0: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
72b0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
72c0: 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  EGER;.    }..   
72d0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   /*.    ** If th
72e0: 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68  e input is of th
72f0: 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e  e form Z (not Y.
7300: 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e  Z or X.Y.Z) then
7310: 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20   the name Z.    
7320: 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20 74  ** might refer t
7330: 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20  o an result-set 
7340: 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61 70  alias.  This hap
7350: 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
7360: 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77  e, when.    ** w
7370: 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20  e are resolving 
7380: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45  names in the WHE
7390: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
73a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61   following comma
73b0: 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd:.    **.    *
73c0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62  *     SELECT a+b
73d0: 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65   AS x FROM table
73e0: 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20   WHERE x<10;.   
73f0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61   **.    ** In ca
7400: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72  ses like this, r
7410: 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74  eplace pExpr wit
7420: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
7430: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a  expression that.
7440: 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65      ** forms the
7450: 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72   result set entr
7460: 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20  y ("a+b" in the 
7470: 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74  example) and ret
7480: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
7490: 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
74a0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
74b0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
74c0: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  et should have a
74d0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
74e0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74  ** resolved by t
74f0: 68 65 20 74 69 6d 65 20 74 68 65 20 57 48 45 52  he time the WHER
7500: 45 20 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f  E clause is reso
7510: 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lved..    */.   
7520: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 70   if( cnt==0 && p
7530: 45 4c 69 73 74 21 3d 30 20 26 26 20 7a 54 61 62  EList!=0 && zTab
7540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
7550: 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e  (j=0; j<pEList->
7560: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
7570: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d       char *zAs =
7580: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
7590: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
75a0: 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74   zAs!=0 && sqlit
75b0: 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a  e3StrICmp(zAs, z
75c0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
75d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
75e0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
75f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
7600: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45   );.          pE
7610: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b  xpr->op = TK_AS;
7620: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
7630: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  ->iColumn = j;. 
7640: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7650: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
7660: 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61  xprDup(pEList->a
7670: 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [j].pExpr);.    
7680: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
7690: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
76a0: 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d   zTab==0 && zDb=
76b0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
76c0: 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  goto lookupname_
76d0: 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d  end_2;.        }
76e0: 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a  .      } .    }.
76f0: 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
7700: 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65  to the next name
7710: 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c   context.  The l
7720: 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68  oop will exit wh
7730: 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  en either.    **
7740: 20 77 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   we have a match
7750: 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e   (cnt>0) or when
7760: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e   we run out of n
7770: 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20  ame contexts..  
7780: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
7790: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43  ==0 ){.      pNC
77a0: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
77b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
77c0: 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61   ** If X and Y a
77d0: 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65  re NULL (in othe
77e0: 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20  r words if only 
77f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
7800: 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69  Z is.  ** suppli
7810: 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ed) and the valu
7820: 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73  e of Z is enclos
7830: 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f  ed in double-quo
7840: 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a  tes, then.  ** Z
7850: 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74   is a string lit
7860: 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e  eral if it doesn
7870: 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c  't match any col
7880: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74  umn names.  In t
7890: 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77  hat.  ** case, w
78a0: 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e  e need to return
78b0: 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20   right away and 
78c0: 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61  not make any cha
78d0: 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78  nges to.  ** pEx
78e0: 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65  pr..  **.  ** Be
78f0: 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e  cause no referen
7900: 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f  ce was made to o
7910: 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74  uter contexts, t
7920: 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a  he pNC->nRef.  *
7930: 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  * fields are not
7940: 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20   changed in any 
7950: 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  context..  */.  
7960: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54  if( cnt==0 && zT
7970: 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e  ab==0 && pColumn
7980: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27  Token->z[0]=='"'
7990: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
79a0: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65  ee(zCol);.    re
79b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
79c0: 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65  *.  ** cnt==0 me
79d0: 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f  ans there was no
79e0: 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20  t match.  cnt>1 
79f0: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65  means there were
7a00: 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72   two or.  ** mor
7a10: 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68  e matches.  Eith
7a20: 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20  er way, we have 
7a30: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  an error..  */. 
7a40: 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20   if( cnt!=1 ){. 
7a50: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a     char *z = 0;.
7a60: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
7a70: 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d      zErr = cnt==
7a80: 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  0 ? "no such col
7a90: 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69  umn: %s" : "ambi
7aa0: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
7ab0: 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20  e: %s";.    if( 
7ac0: 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  zDb ){.      sql
7ad0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7ae0: 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62  , zDb, ".", zTab
7af0: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
7b00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
7b10: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
7b20: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7b30: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
7b40: 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  l, 0);.    }else
7b50: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
7b60: 74 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a  teStrDup(zCol);.
7b70: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7b80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7b90: 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20  , zErr, z);.    
7ba0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
7bb0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
7bc0: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
7bd0: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
7be0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
7bf0: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
7c00: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
7c10: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
7c20: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
7c30: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
7c40: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
7c50: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
7c60: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
7c70: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
7c80: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
7c90: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
7ca0: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
7cb0: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
7cc0: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
7cd0: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
7ce0: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
7cf0: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
7d00: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
7d10: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
7d20: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
7d30: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
7d40: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
7d50: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73  mn;.    if( n>=s
7d60: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
7d70: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69   ){.      n = si
7d80: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d  zeof(Bitmask)*8-
7d90: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
7da0: 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75  ert( pMatch->iCu
7db0: 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  rsor==pExpr->iTa
7dc0: 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63  ble );.    pMatc
7dd0: 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 31 3c  h->colUsed |= 1<
7de0: 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e  <n;.  }..lookupn
7df0: 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c  ame_end:.  /* Cl
7e00: 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
7e10: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46  n.  */.  sqliteF
7e20: 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69  ree(zDb);.  sqli
7e30: 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20  teFree(zTab);.  
7e40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7e50: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
7e60: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  .  pExpr->pLeft 
7e70: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
7e80: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
7e90: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
7ea0: 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  ->pRight = 0;.  
7eb0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
7ec0: 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d  OLUMN;.lookupnam
7ed0: 65 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74  e_end_2:.  sqlit
7ee0: 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69  eFree(zCol);.  i
7ef0: 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  f( cnt==1 ){.   
7f00: 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20   assert( pNC!=0 
7f10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  );.    sqlite3Au
7f20: 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70  thRead(pParse, p
7f30: 45 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c  Expr, pNC->pSrcL
7f40: 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ist);.    if( pM
7f50: 61 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d  atch && !pMatch-
7f60: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
7f70: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
7f80: 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20  pMatch->pTab;.  
7f90: 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65    }.    /* Incre
7fa0: 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61  ment the nRef va
7fb0: 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20  lue on all name 
7fc0: 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f  contexts from To
7fd0: 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a  pNC up to.    **
7fe0: 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65   the point where
7ff0: 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65   the name matche
8000: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b  d. */.    for(;;
8010: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8020: 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20   pTopNC!=0 );.  
8030: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66      pTopNC->nRef
8040: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ++;.      if( pT
8050: 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61  opNC==pNC ) brea
8060: 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20  k;.      pTopNC 
8070: 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b  = pTopNC->pNext;
8080: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
8090: 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n 0;.  } else {.
80a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
80b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
80c0: 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67  routine is desig
80d0: 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20  ned as an xFunc 
80e0: 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
80f0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76  ()..**.** Resolv
8100: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  e symbolic names
8110: 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20   into TK_COLUMN 
8120: 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68  operators for th
8130: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64  e current.** nod
8140: 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
8150: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
8160: 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  n 0 to continue 
8170: 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a  the search down.
8180: 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32  ** the tree or 2
8190: 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72   to abort the tr
81a0: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ee walk..**.** T
81b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
81c0: 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63   does error chec
81d0: 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65  king and name re
81e0: 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  solution for.** 
81f0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20  function names. 
8200: 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f   The operator fo
8210: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
8220: 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64  tions is changed
8230: 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55  .** to TK_AGG_FU
8240: 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69  NCTION..*/.stati
8250: 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76  c int nameResolv
8260: 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72  erStep(void *pAr
8270: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
8280: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
8290: 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65  pNC = (NameConte
82a0: 78 74 2a 29 70 41 72 67 3b 0a 20 20 53 72 63 4c  xt*)pArg;.  SrcL
82b0: 69 73 74 20 2a 70 53 72 63 4c 69 73 74 3b 0a 20  ist *pSrcList;. 
82c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
82d0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
82e0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73  ) return 1;.  as
82f0: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
8300: 20 20 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43    pSrcList = pNC
8310: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 70 50  ->pSrcList;.  pP
8320: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
8330: 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48  se;..  if( ExprH
8340: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
8350: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
8360: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
8370: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
8380: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
8390: 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ed);.#ifndef NDE
83a0: 42 55 47 0a 20 20 69 66 28 20 70 53 72 63 4c 69  BUG.  if( pSrcLi
83b0: 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  st ){.    int i;
83c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
83d0: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
83e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
83f0: 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b  rt( pSrcList->a[
8400: 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26  i].iCursor>=0 &&
8410: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
8420: 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e  iCursor<pParse->
8430: 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nTab);.    }.  }
8440: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
8450: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
8460: 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f     /* Double-quo
8470: 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a  ted strings (ex:
8480: 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64   "abc") are used
8490: 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20   as identifiers 
84a0: 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  if.    ** possib
84b0: 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  le.  Otherwise t
84c0: 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74  hey remain as st
84d0: 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71  rings.  Single-q
84e0: 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72  uoted.    ** str
84f0: 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29  ings (ex: 'abc')
8500: 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69   are always stri
8510: 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20  ng literals..   
8520: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
8530: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
8540: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
8550: 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72  .z[0]=='\'' ) br
8560: 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  eak;.      /* Fa
8570: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
8580: 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74   TK_ID case if t
8590: 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d  his is a double-
85a0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f  quoted string */
85b0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20  .    }.    /* A 
85c0: 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20  lone identifier 
85d0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
85e0: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
85f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20      case TK_ID: 
8600: 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  {.      lookupNa
8610: 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  me(pParse, 0, 0,
8620: 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20   &pExpr->token, 
8630: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
8640: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8650: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74   }.  .    /* A t
8660: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f  able name and co
8670: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49  lumn name:     I
8680: 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61  D.ID.    ** Or a
8690: 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65   database, table
86a0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44   and column:  ID
86b0: 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20  .ID.ID.    */.  
86c0: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b    case TK_DOT: {
86d0: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43  .      Token *pC
86e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b  olumn;.      Tok
86f0: 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20  en *pTable;.    
8700: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20    Token *pDb;.  
8710: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
8720: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20  ;..      /* if( 
8730: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72  pSrcList==0 ) br
8740: 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52  eak; */.      pR
8750: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
8760: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
8770: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
8780: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  D ){.        pDb
8790: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
87a0: 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70  able = &pExpr->p
87b0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
87c0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
87d0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
87e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
87f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
8800: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ht->op==TK_DOT )
8810: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  ;.        pDb = 
8820: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
8830: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  oken;.        pT
8840: 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e  able = &pRight->
8850: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
8860: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
8870: 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d  &pRight->pRight-
8880: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  >token;.      }.
8890: 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65        lookupName
88a0: 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54  (pParse, pDb, pT
88b0: 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70  able, pColumn, p
88c0: 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  NC, pExpr);.    
88d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
88e0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76  }..    /* Resolv
88f0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  e function names
8900: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8910: 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a   TK_CONST_FUNC:.
8920: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
8930: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
8940: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
8950: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20  pExpr->pList;   
8960: 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
8970: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
8980: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70  nt n = pList ? p
8990: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
89a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
89b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
89c0: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
89d0: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
89e0: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
89f0: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
8a00: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72   */.      int wr
8a10: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30  ong_num_args = 0
8a20: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8a30: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
8a40: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8a50: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
8a60: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8a70: 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e  /* True if is an
8a80: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8a90: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
8aa0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   i;.      int nI
8ab0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8ac0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8ad0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
8ae0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
8af0: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
8b00: 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20  ar *zId;        
8b10: 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
8b20: 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  ion name. */.   
8b30: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
8b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8b50: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
8b60: 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  out the function
8b70: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e   */.      int en
8b80: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
8b90: 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  enc;  /* The dat
8ba0: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a  abase encoding *
8bb0: 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  /..      zId = p
8bc0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
8bd0: 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72       nId = pExpr
8be0: 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  ->token.n;.     
8bf0: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
8c00: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
8c10: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
8c20: 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  , n, enc, 0);.  
8c30: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
8c40: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
8c50: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8c60: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
8c70: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20  , zId, nId, -1, 
8c80: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
8c90: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
8ca0: 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63            no_suc
8cb0: 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20  h_func = 1;.    
8cc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8cd0: 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61       wrong_num_a
8ce0: 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rgs = 1;.       
8cf0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
8d00: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
8d10: 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b   pDef->xFunc==0;
8d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8d30: 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e  f( is_agg && !pN
8d40: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20  C->allowAgg ){. 
8d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8d60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8d70: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
8d80: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a  ate function %.*
8d90: 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a  s()", nId,zId);.
8da0: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
8db0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f  r++;.        is_
8dc0: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  agg = 0;.      }
8dd0: 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68  else if( no_such
8de0: 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  _func ){.       
8df0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8e00: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
8e10: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  h function: %.*s
8e20: 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
8e30: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
8e40: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
8e50: 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  f( wrong_num_arg
8e60: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
8e70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8e80: 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65  rse,"wrong numbe
8e90: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
8ea0: 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  o function %.*s(
8eb0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
8ec0: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
8ed0: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
8ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8ef0: 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20  f( is_agg ){.   
8f00: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
8f10: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
8f20: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68  ;.        pNC->h
8f30: 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  asAgg = 1;.     
8f40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
8f50: 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77  agg ) pNC->allow
8f60: 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Agg = 0;.      f
8f70: 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72  or(i=0; pNC->nEr
8f80: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
8f90: 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45  ){.        walkE
8fa0: 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61  xprTree(pList->a
8fb0: 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52  [i].pExpr, nameR
8fc0: 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43  esolverStep, pNC
8fd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8fe0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e   if( is_agg ) pN
8ff0: 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b  C->allowAgg = 1;
9000: 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45  .      /* FIX ME
9010: 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72  :  Compute pExpr
9020: 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64  ->affinity based
9030: 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64   on the expected
9040: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a   return.      **
9050: 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e   type of the fun
9060: 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a  ction .      */.
9070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f        return is_
9080: 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  agg;.    }.#ifnd
9090: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
90a0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
90b0: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
90c0: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
90d0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
90e0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
90f0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
9100: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
9110: 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65   nRef = pNC->nRe
9120: 66 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  f;.        sqlit
9130: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
9140: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9150: 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20  Select, pNC);.  
9160: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
9170: 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b  C->nRef>=nRef );
9180: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65  .        if( nRe
9190: 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a  f!=pNC->nRef ){.
91a0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
91b0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
91c0: 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a   EP_VarSelect);.
91d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
91e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
91f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9200: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
9210: 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f  lks an expressio
9220: 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c  n tree and resol
9230: 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ves references t
9240: 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d  o.** table colum
9250: 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68  ns.  Nodes of th
9260: 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20  e form ID.ID or 
9270: 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20  ID resolve into 
9280: 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74  an.** index to t
9290: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
92a0: 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61  table list and a
92b0: 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20   column offset. 
92c0: 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70   The .** Expr.op
92d0: 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f  code for such no
92e0: 64 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74  des is changed t
92f0: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68  o TK_COLUMN.  Th
9300: 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a  e Expr.iTable.**
9310: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
9320: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  d to the index o
9330: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
9340: 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
9350: 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22  st.** plus the "
9360: 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68  base" value.  Th
9370: 65 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c  e base value wil
9380: 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63  l ultimately bec
9390: 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20  ome the.** VDBE 
93a0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
93b0: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
93c0: 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
93d0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a   the referenced.
93e0: 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45  ** table.  The E
93f0: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
9400: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
9410: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
9420: 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74   column .** of t
9430: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
9440: 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69  ble.  The Expr.i
9450: 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72  Column value for
9460: 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
9470: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20  ROWID column is 
9480: 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52  -1.  Any INTEGER
9490: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
94a0: 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20  umn is tried as 
94b0: 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20  an.** alias for 
94c0: 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  ROWID..**.** Als
94d0: 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69  o resolve functi
94e0: 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65  on names and che
94f0: 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  ck the functions
9500: 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75   for proper.** u
9510: 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  sage.  Make sure
9520: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61   all function na
9530: 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a  mes are recogniz
9540: 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74  ed and all funct
9550: 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65  ions.** have the
9560: 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
9570: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c  of arguments.  L
9580: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
9590: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
95a0: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61  se->zErrMsg if a
95b0: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
95c0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
95d0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
95e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
95f0: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
9600: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
9610: 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68  ions then set th
9620: 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70  e EP_Agg.** prop
9630: 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72  erty on the expr
9640: 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ession..*/.int s
9650: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
9660: 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43 6f  eNames(.  NameCo
9670: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
9680: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74    /* Namespace t
9690: 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73  o resolve expres
96a0: 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45  sions in. */.  E
96b0: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
96c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
96d0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
96e0: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20  nalyzed. */.){. 
96f0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
9700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 61 6c 6b  return 0;.  walk
9710: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
9720: 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70  nameResolverStep
9730: 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28 20 70 4e  , pNC);.  if( pN
9740: 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20  C->nErr>0 ){.   
9750: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
9760: 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72  (pExpr, EP_Error
9770: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9780: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9790: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
97a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69  ;.}../*.** A poi
97b0: 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f 66  nter instance of
97c0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
97d0: 69 73 20 75 73 65 64 20 74 6f 20 70 61 73 73 20  is used to pass 
97e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74  information.** t
97f0: 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72 54  hrough walkExprT
9800: 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75 62  ree into codeSub
9810: 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a  queryStep()..*/.
9820: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 51  typedef struct Q
9830: 75 65 72 79 43 6f 64 65 72 20 51 75 65 72 79 43  ueryCoder QueryC
9840: 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75 65  oder;.struct Que
9850: 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72 73  ryCoder {.  Pars
9860: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
9870: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
9880: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d  context */.  Nam
9890: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20  eContext *pNC;  
98a0: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f    /* Namespace o
98b0: 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e  f first enclosin
98c0: 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a  g query */.};...
98d0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
98e0: 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65 72 69  ode for subqueri
98f0: 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74  es and IN operat
9900: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20 6f 70  ors..**.** IN op
9910: 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20 69 6e  erators comes in
9920: 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a   two forms:.**.*
9930: 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72  *           expr
9940: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 2a   IN (exprlist).*
9950: 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  * and.**        
9960: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
9970: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  CT ...).**.** Th
9980: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20  e first form is 
9990: 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65 61 74  handled by creat
99a0: 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64 69 6e  ing a set holdin
99b0: 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66  g the list.** of
99c0: 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e   allowed values.
99d0: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72    The second for
99e0: 6d 20 63 61 75 73 65 73 20 74 68 65 20 53 45 4c  m causes the SEL
99f0: 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ECT to generate 
9a00: 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
9a10: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
9a20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
9a30: 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69  BQUERY.void sqli
9a40: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
9a50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9a60: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
9a70: 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d 20 30  int testAddr = 0
9a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
9aa0: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
9ab0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
9ac0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9ad0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
9ae0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
9af0: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
9b00: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
9b10: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
9b20: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
9b30: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
9b40: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
9b50: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
9b60: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
9b70: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
9b80: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
9b90: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
9ba0: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
9bb0: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
9bc0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
9bd0: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
9be0: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
9bf0: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
9c00: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
9c10: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
9c20: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
9c30: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
9c40: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
9c50: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
9c60: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
9c70: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
9c80: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
9c90: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
9ca0: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
9cb0: 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45  asAnyProperty(pE
9cc0: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
9cd0: 74 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 74  t) && !pParse->t
9ce0: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
9cf0: 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72 73 65  int mem = pParse
9d00: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71  ->nMem++;.    sq
9d10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9d20: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 6d 65  , OP_MemLoad, me
9d30: 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 41  m, 0);.    testA
9d40: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
9d50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
9d60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65   0, 0);.    asse
9d70: 72 74 28 20 74 65 73 74 41 64 64 72 3e 30 20 29  rt( testAddr>0 )
9d80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9d90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
9da0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
9db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9dc0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
9dd0: 2c 20 6d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  , mem, 1);.  }..
9de0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
9df0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
9e00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9e10: 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50 75 73  OP_AggContextPus
9e20: 68 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  h, 0, 0);.  }.. 
9e30: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
9e40: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
9e50: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
9e60: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
9e70: 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e     KeyInfo keyIn
9e80: 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  fo;.      int ad
9e90: 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64  dr;        /* Ad
9ea0: 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e  dress of OP_Open
9eb0: 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74  Virtual instruct
9ec0: 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66  ion */..      af
9ed0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
9ee0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
9ef0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20  pr->pLeft);..   
9f00: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
9f10: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
9f20: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
9f30: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
9f40: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
9f50: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
9f60: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
9f70: 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20 74 61  ay. A virtual ta
9f80: 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  ble is .      **
9f90: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e   filled with sin
9fa0: 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20  gle-field index 
9fb0: 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e  keys representin
9fc0: 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  g the results.  
9fd0: 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
9fe0: 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
9ff0: 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
a000: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
a010: 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
a020: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
a030: 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
a040: 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
a050: 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
a060: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
a070: 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
a080: 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
a090: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
a0a0: 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
a0b0: 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
a0c0: 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
a0d0: 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
a0e0: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
a0f0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
a100: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
a110: 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
a120: 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
a130: 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
a140: 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
a150: 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
a160: 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
a170: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
a180: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
a190: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
a1a0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
a1b0: 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
a1c0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
a1d0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
a1e0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
a1f0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
a200: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
a210: 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 45 78 70  penVirtual, pExp
a220: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
a230: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79       memset(&key
a240: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
a250: 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  keyInfo));.     
a260: 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   keyInfo.nField 
a270: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
a280: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a290: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
a2a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
a2b0: 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  1);..      if( p
a2c0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
a2d0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
a2e0: 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
a2f0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
a300: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
a310: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a320: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
a330: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
a340: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
a350: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
a360: 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
a370: 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
a380: 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
a390: 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 6d         int iParm
a3a0: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
a3b0: 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66 69 6e   +  (((int)affin
a3c0: 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20  ity)<<16);.     
a3d0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
a3e0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ist;.        ass
a3f0: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61  ert( (pExpr->iTa
a400: 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d  ble&0x0000FFFF)=
a410: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
a420: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a430: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
a440: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
a450: 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20  SRT_Set, iParm, 
a460: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
a470: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
a480: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45  xpr->pSelect->pE
a490: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66  List;.        if
a4a0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
a4b0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20 0a  st->nExpr>0 ){ .
a4c0: 20 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66            keyInf
a4d0: 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62 69 6e  o.aColl[0] = bin
a4e0: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
a4f0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
a500: 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
a510: 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b        pEList->a[
a520: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
a530: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
a540: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73   if( pExpr->pLis
a550: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
a560: 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70 72  Case 2:     expr
a570: 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20   IN (exprlist). 
a580: 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f         **..** Fo
a590: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
a5a0: 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
a5b0: 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
a5c0: 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
a5d0: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
a5e0: 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
a5f0: 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
a600: 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
a610: 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
a620: 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
a630: 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
a640: 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
a650: 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
a660: 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
a670: 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
a680: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
a690: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a6a0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a6b0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
a6c0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
a6d0: 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  t;.        struc
a6e0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a6f0: 2a 70 49 74 65 6d 3b 0a 0a 20 20 20 20 20 20 20  *pItem;..       
a700: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
a710: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
a720: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
a730: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 20  F_NUMERIC;.     
a740: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b 65 79     }.        key
a750: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
a760: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
a770: 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  oll;..        /*
a780: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
a790: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
a7a0: 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
a7b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
a7c0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
a7d0: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
a7e0: 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
a7f0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
a800: 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
a810: 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  pr;..          /
a820: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
a830: 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
a840: 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
a850: 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
a860: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
a870: 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
a880: 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
a890: 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
a8a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
a8b0: 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
a8c0: 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
a8d0: 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
a8e0: 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
a8f0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
a900: 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
a910: 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
a920: 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
a930: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
a940: 74 65 73 74 41 64 64 72 3e 3d 30 20 26 26 20 21  testAddr>=0 && !
a950: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a960: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
a970: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 4f 70            VdbeOp
a980: 20 2a 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *aOp = sqlite3V
a990: 64 62 65 47 65 74 4f 70 28 76 2c 20 74 65 73 74  dbeGetOp(v, test
a9a0: 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Addr-1);.       
a9b0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
a9c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
a9d0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
a9e0: 20 20 20 20 20 20 20 20 20 20 61 4f 70 5b 69 5d            aOp[i]
a9f0: 2e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  .opcode = OP_Noo
aa00: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  p;.            }
aa10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
aa20: 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  tAddr = 0;.     
aa30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
aa40: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
aa50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
aa60: 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
aa70: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
aa80: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
aa90: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
aaa0: 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20  se, pE2);.      
aab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
aac0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
aad0: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69  ord, 1, 0, &affi
aae0: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
aaf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab00: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
ab10: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
ab20: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
ab30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ab40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ab50: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76  geP3(v, addr, (v
ab60: 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20  oid *)&keyInfo, 
ab70: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
ab80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ab90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
aba0: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
abb0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
abc0: 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20   /* This has to 
abd0: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
abe0: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
abf0: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
ac00: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
ac10: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
ac20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
ac30: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
ac40: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
ac50: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
ac60: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
ac70: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 6f   */.      int so
ac80: 70 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  p;.      Select 
ac90: 2a 70 53 65 6c 3b 0a 0a 20 20 20 20 20 20 70 45  *pSel;..      pE
aca0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
acb0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
acc0: 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70       pSel = pExp
acd0: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
ace0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
acf0: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
ad00: 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52 54 5f        sop = SRT_
ad10: 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Mem;.      }else
ad20: 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  {.        static
ad30: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f 6e 65   const Token one
ad40: 20 3d 20 7b 20 22 31 22 2c 20 30 2c 20 31 20 7d   = { "1", 0, 1 }
ad50: 3b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20  ;.        sop = 
ad60: 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20  SRT_Exists;.    
ad70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
ad80: 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c 2d 3e  istDelete(pSel->
ad90: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
ada0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
adb0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
adc0: 70 70 65 6e 64 28 30 2c 20 0a 20 20 20 20 20 20  ppend(0, .      
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 28      sqlite3Expr(
adf0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30  TK_INTEGER, 0, 0
ae00: 2c 20 26 6f 6e 65 29 2c 20 30 29 3b 0a 20 20 20  , &one), 0);.   
ae10: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
ae20: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
ae30: 20 70 53 65 6c 2c 20 73 6f 70 2c 20 70 45 78 70   pSel, sop, pExp
ae40: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30  r->iColumn, 0, 0
ae50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
ae60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ae70: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53  .  if( pExpr->pS
ae80: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
ae90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aea0: 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50 6f   OP_AggContextPo
aeb0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  p, 0, 0);.  }.  
aec0: 69 66 28 20 74 65 73 74 41 64 64 72 20 29 7b 0a  if( testAddr ){.
aed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
aee0: 68 61 6e 67 65 50 32 28 76 2c 20 74 65 73 74 41  hangeP2(v, testA
aef0: 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  ddr, sqlite3Vdbe
af00: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
af10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
af20: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
af30: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
af40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  */../*.** Genera
af50: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
af60: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
af70: 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
af80: 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
af90: 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65  z[0..n-1] on the
afa0: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   stack..*/.stati
afb0: 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
afc0: 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  er(Vdbe *v, cons
afd0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
afe0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
aff0: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
b000: 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20  2(z, &i) ){.    
b010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b020: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b030: 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  i, 0);.  }else i
b040: 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e  f( sqlite3FitsIn
b050: 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20  64Bits(z) ){.   
b060: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
b070: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
b080: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65  , 0, z, n);.  }e
b090: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b0a0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65  VdbeOp3(v, OP_Re
b0b0: 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  al, 0, 0, z, n);
b0c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
b0d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
b0e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
b0f0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
b100: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
b110: 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20  ssion and leave 
b120: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68  the result on th
b130: 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a  e top of stack..
b140: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
b150: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
b160: 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
b170: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
b180: 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
b190: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
b1a0: 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
b1b0: 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
b1c0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
b1d0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
b1e0: 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
b1f0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
b200: 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
b210: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
b220: 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
b230: 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
b240: 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
b250: 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
b260: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
b270: 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
b280: 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
b290: 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
b2a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b2b0: 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
b2c0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
b2d0: 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
b2e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
b2f0: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66  ;.  int op;.  if
b300: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b310: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
b320: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b330: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
b340: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  ll, 0, 0);.    r
b350: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20  eturn;.  }.  op 
b360: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
b370: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
b380: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
b390: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
b3a0: 61 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20 26 26  arse->fillAgg &&
b3b0: 20 70 45 78 70 72 2d 3e 69 41 67 67 3e 3d 30 20   pExpr->iAgg>=0 
b3c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b3d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b3e0: 50 5f 41 67 67 47 65 74 2c 20 70 45 78 70 72 2d  P_AggGet, pExpr-
b3f0: 3e 69 41 67 67 43 74 78 2c 20 70 45 78 70 72 2d  >iAggCtx, pExpr-
b400: 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65  >iAgg);.      }e
b410: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
b420: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
b430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b440: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
b450: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
b460: 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
b470: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
b480: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
b490: 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  (v, pExpr->pTab,
b4a0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
b4b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b4c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b4d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
b4e0: 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  wid, pExpr->iTab
b4f0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  le, 0);.      }.
b500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b510: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
b520: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
b530: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70  codeInteger(v, p
b540: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
b550: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
b560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b570: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
b580: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
b590: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
b5a0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f    assert( TK_FLO
b5b0: 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20  AT==OP_Real );. 
b5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b5d0: 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e  STRING==OP_Strin
b5e0: 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g8 );.      sqli
b5f0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70  te3VdbeOp3(v, op
b600: 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74  , 0, 0, pExpr->t
b610: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
b620: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73  oken.n);.      s
b630: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
b640: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
b650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b660: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
b670: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b690: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
b6a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b6b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6c0: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
b6d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
b6e0: 42 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  B: {.      asser
b6f0: 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48  t( TK_BLOB==OP_H
b700: 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  exBlob );.      
b710: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
b720: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78 70  , op, 0, 0, pExp
b730: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70 45  r->token.z+1, pE
b740: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29 3b  xpr->token.n-1);
b750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b760: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
b770: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
b780: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b790: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
b7a0: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
b7b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b7c0: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
b7d0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
b7e0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
b7f0: 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20  >token.n>1 ){.  
b800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b810: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
b820: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
b830: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
b840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b850: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b860: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
b870: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
b880: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b890: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
b8a0: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
b8b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b8c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b8d0: 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
b8e0: 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
b8f0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
b900: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
b910: 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
b920: 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
b930: 69 6e 74 20 61 66 66 2c 20 6f 70 3b 0a 20 20 20  int aff, op;.   
b940: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b950: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b960: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b970: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
b980: 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
b990: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
b9a0: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
b9b0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
b9c0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20  TE_AFF_INTEGER: 
b9d0: 20 20 6f 70 20 3d 20 4f 50 5f 54 6f 49 6e 74 3b    op = OP_ToInt;
b9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b9f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ba00: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 20 20  _AFF_NUMERIC:   
ba10: 6f 70 20 3d 20 4f 50 5f 54 6f 4e 75 6d 65 72 69  op = OP_ToNumeri
ba20: 63 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c;  break;.     
ba30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
ba40: 46 46 5f 54 45 58 54 3a 20 20 20 20 20 20 6f 70  FF_TEXT:      op
ba50: 20 3d 20 4f 50 5f 54 6f 54 65 78 74 3b 20 20 20   = OP_ToText;   
ba60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ba70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
ba80: 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 6f 70 20 3d  _NONE:      op =
ba90: 20 4f 50 5f 54 6f 42 6c 6f 62 3b 20 20 20 20 20   OP_ToBlob;     
baa0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
bab0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bac0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
bad0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
bae0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
baf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
bb00: 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
bb10: 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
bb20: 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
bb30: 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
bb40: 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
bb50: 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
bb60: 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
bb70: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
bb80: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
bb90: 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
bba0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bbb0: 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
bbc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bbd0: 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
bbe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
bbf0: 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
bc00: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
bc10: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
bc20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
bc30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
bc40: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
bc50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
bc60: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
bc70: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
bc80: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
bc90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
bca0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
bcb0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
bcc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bcd0: 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
bce0: 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
bcf0: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
bd00: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
bd10: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
bd20: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
bd30: 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
bd40: 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
bd50: 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
bd60: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
bd70: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
bd80: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
bd90: 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
bda0: 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
bdb0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
bdc0: 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20  D==OP_And );.   
bdd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
bde0: 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20  ==OP_Or );.     
bdf0: 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
be00: 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20  ==OP_Add );.    
be10: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
be20: 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
be30: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
be40: 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
be50: 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61  inder );.      a
be60: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
be70: 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20  ==OP_BitAnd );. 
be80: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
be90: 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
bea0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
beb0: 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
bec0: 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73  vide );.      as
bed0: 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
bee0: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
bef0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bf00: 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
bf10: 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  ftRight );.     
bf20: 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
bf30: 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
bf40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bf50: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
bf60: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
bf70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
bf80: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
bf90: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
bfa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bfb0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
bfc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bfd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bfe0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
bff0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
c000: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
c010: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
c020: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
c030: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
c040: 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   || pLeft->op==T
c050: 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
c060: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20       Token *p = 
c070: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pLeft->token;. 
c080: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
c090: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
c0a0: 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20  ->n + 2 );.     
c0b0: 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d     sprintf(z, "-
c0c0: 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e  %.*s", p->n, p->
c0d0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
c0e0: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
c0f0: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
c100: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c110: 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30  v, OP_Real, 0, 0
c120: 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20  , z, p->n+1);.  
c130: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c140: 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
c150: 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  er(v, z, p->n+1)
c160: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c170: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
c180: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
c190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c1a0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
c1b0: 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20  into TK_NOT */. 
c1c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c1d0: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
c1e0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
c1f0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
c200: 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
c210: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c220: 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
c230: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c240: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c250: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
c260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c270: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
c280: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
c290: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c2a0: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
c2b0: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
c2c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
c2d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c2e0: 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
c2f0: 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
c300: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
c310: 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
c320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c330: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
c340: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
c350: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c360: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
c370: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c380: 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  dest = sqlite3Vd
c390: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
c3a0: 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 2;.      sqli
c3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c3c0: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
c3d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c3e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
c3f0: 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
c400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c410: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
c420: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
c430: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c440: 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30  (v, OP_AggGet, 0
c450: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a  , pExpr->iAgg);.
c460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c470: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
c480: 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
c490: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
c4a0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
c4b0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
c4c0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  ->pList;.      i
c4d0: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  nt nExpr = pList
c4e0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
c4f0: 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44  : 0;.      FuncD
c500: 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20  ef *pDef;.      
c510: 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63  int nId;.      c
c520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a  onst char *zId;.
c530: 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 30        int p2 = 0
c540: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
c550: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50       u8 enc = pP
c560: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
c570: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
c580: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  oll = 0;.      z
c590: 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
c5a0: 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  n.z;.      nId =
c5b0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b   pExpr->token.n;
c5c0: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
c5d0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
c5e0: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
c5f0: 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65  d, nId, nExpr, e
c600: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  nc, 0);.      as
c610: 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b  sert( pDef!=0 );
c620: 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73  .      nExpr = s
c630: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
c640: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
c650: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  List);.      for
c660: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
c670: 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<32; i++){.   
c680: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c690: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
c6a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c6b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
c6c0: 32 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20  2 |= (1<<i);.   
c6d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
c6e0: 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
c6f0: 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29  lSeq && !pColl )
c700: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
c710: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
c720: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c730: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c740: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c750: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
c760: 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  Def->needCollSeq
c770: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c780: 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
c790: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
c7a0: 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
c7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c7c0: 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
c7d0: 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
c7e0: 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P3_COLLSEQ);
c7f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c800: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
c810: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45   OP_Function, nE
c820: 78 70 72 2c 20 70 32 2c 20 28 63 68 61 72 2a 29  xpr, p2, (char*)
c830: 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46  pDef, P3_FUNCDEF
c840: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c850: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c870: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
c880: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
c890: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
c8a0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
c8b0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
c8c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
c8d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c8e0: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45  , OP_MemLoad, pE
c8f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29  xpr->iColumn, 0)
c900: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c910: 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20  ent((v, "# load 
c920: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
c930: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
c940: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c950: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
c960: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63  nt addr;.      c
c970: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
c980: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
c990: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
c9a0: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
c9b0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
c9c0: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
c9d0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
c9e0: 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
c9f0: 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ts.      ** of t
ca00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
ca10: 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
ca20: 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
ca30: 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
ca40: 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50       ** P3 of OP
ca50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20  _MakeRecord..   
ca60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69     */.      affi
ca70: 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
ca80: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
ca90: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
caa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cab0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a  Integer, 1, 0);.
cac0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
cad0: 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
cae0: 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
caf0: 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  . The temporary 
cb00: 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70  table.      ** p
cb10: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e  Expr->iTable con
cb20: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
cb30: 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
cb40: 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20  e (...) set..   
cb50: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
cb60: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
cb70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
cb80: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
cb90: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
cba0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
cbb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cbc0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
cbd0: 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20   -1, addr+4);   
cbe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72           /* addr
cbf0: 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71   + 0 */.      sq
cc00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cc10: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
cc20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cc30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
cc40: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 0, 0);.     
cc50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cc60: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
cc70: 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20   addr+7);.      
cc80: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
cc90: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
cca0: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
ccb0: 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20  , 1);   /* addr 
ccc0: 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 4 */.      sql
ccd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cce0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
ccf0: 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37  ->iTable, addr+7
cd00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cd10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cd20: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20  AddImm, -1, 0); 
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a   /* addr + 6 */.
cd50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cd60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
cd70: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
cd80: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
cd90: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
cda0: 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
cdb0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
cdc0: 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
cdd0: 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
cde0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
cdf0: 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
ce00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ce10: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ode(pParse, pLef
ce20: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ce30: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ce40: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
ce50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ce60: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
ce70: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
ce80: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
ce90: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
cea0: 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Ge, 0, 0);.     
ceb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cec0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
ced0: 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65   0);.      pLIte
cee0: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
cef0: 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
cf00: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
cf10: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
cf20: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
cf30: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
cf40: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
cf50: 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b  t, OP_Le, 0, 0);
cf60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cf70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e  beAddOp(v, OP_An
cf80: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
cf90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cfa0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a   case TK_UPLUS:.
cfb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
cfc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
cfd0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
cfe0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
cff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d000: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
d010: 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE: {.      int 
d020: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a  expr_end_label;.
d030: 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e        int jumpIn
d040: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  st;.      int ad
d050: 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  dr;.      int nE
d060: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
d070: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
d080: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20   *pEList;.      
d090: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d0a0: 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
d0b0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
d0c0: 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  Expr->pList);.  
d0d0: 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
d0e0: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
d0f0: 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20  % 2) == 0);.    
d100: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
d110: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
d120: 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
d130: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
d140: 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20        aListelem 
d150: 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
d160: 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73     nExpr = pELis
d170: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
d180: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d  expr_end_label =
d190: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d1a0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d1b0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
d1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d1d0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d1e0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d1f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d200: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
d210: 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  r; i=i+2){.     
d220: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d230: 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
d240: 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  elem[i].pExpr);.
d250: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
d260: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
d270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d280: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
d290: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 1, 1);.       
d2a0: 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f     jumpInst = co
d2b0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
d2c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
d2d0: 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
d2e0: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31       OP_Ne, 0, 1
d310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d330: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
d340: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d350: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
d360: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
d370: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  ddOp(v, OP_IfNot
d380: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
d390: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
d3a0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d3b0: 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
d3c0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d3d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d3e0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
d3f0: 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
d400: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
d410: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d420: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
d430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d440: 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70  ChangeP2(v, jump
d450: 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20 20 20  Inst, addr);.   
d460: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
d470: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
d480: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d490: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
d4a0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
d4b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
d4c0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
d4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d4e0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
d4f0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
d500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d520: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
d530: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d550: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
d560: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a  xpr_end_label);.
d570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d580: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
d590: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
d5a0: 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
d5b0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
d5c0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
d5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d5e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d5f0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
d600: 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
d610: 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
d620: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
d630: 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
d640: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ..return;.      
d650: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
d660: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49  r->iColumn!=OE_I
d670: 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
d680: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
d690: 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c  >iColumn==OE_Rol
d6a0: 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20  lback ||.       
d6b0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
d6c0: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41  >iColumn == OE_A
d6d0: 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20  bort ||.        
d6e0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
d6f0: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61  iColumn == OE_Fa
d700: 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  il );.         s
d710: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d720: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
d730: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78  _CONSTRAINT, pEx
d740: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
d770: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
d780: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 73  n.n);.         s
d790: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
d7a0: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
d7b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
d7c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
d7d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
d7e0: 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
d7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d800: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  ddOp(v, OP_Conte
d810: 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
d820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d830: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
d840: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
d850: 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
d860: 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
d870: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
d880: 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29  "# raise(IGNORE)
d890: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
d8a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
d8b0: 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  eak;.  }.}..#ifn
d8c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d8d0: 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65  TRIGGER./*.** Ge
d8e0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
d8f0: 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
d900: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
d910: 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65  nd leaves the re
d920: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  sult.** on the s
d930: 74 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20  tack.  See also 
d940: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d950: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
d960: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
d970: 20 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c   cache the resul
d980: 74 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  t and modify the
d990: 20 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73   pExpr tree.** s
d9a0: 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d  o that it will m
d9b0: 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63  ake use of the c
d9c0: 61 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20  ached result on 
d9d0: 73 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75  subsequent evalu
d9e0: 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72  ations.** rather
d9f0: 20 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74   than evaluate t
da00: 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73  he whole express
da10: 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76  ion again.  Triv
da20: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ial expressions 
da30: 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65  are.** not cache
da40: 64 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  d.  If the expre
da50: 73 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c  ssion is cached,
da60: 20 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73   its result is s
da70: 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d  tored in a .** m
da80: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
da90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
daa0: 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
dab0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
dac0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
dad0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
dae0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
daf0: 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  em;.  int addr1,
db00: 20 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d   addr2;.  if( v=
db10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
db20: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
db30: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
db40: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
db50: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
db60: 72 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71  r);.  addr2 = sq
db70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
db80: 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61  Addr(v);.  if( a
db90: 64 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20  ddr2>addr1+1 || 
dba0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
dbb0: 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f  (v, addr1)->opco
dbc0: 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  de==OP_Function 
dbd0: 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45  ){.    iMem = pE
dbe0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
dbf0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
dc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc10: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
dc20: 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  e, iMem, 0);.   
dc30: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
dc40: 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a  REGISTER;.  }.}.
dc50: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
dc60: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
dc70: 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
dc80: 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
dc90: 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
dca0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
dcb0: 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  st onto the stac
dcc0: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
dcd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
dce0: 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e  ements pushed on
dcf0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f  to the stack..*/
dd00: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
dd10: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
dd20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
dd30: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
dd40: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
dd50: 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a  ist *pList    /*
dd60: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
dd70: 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
dd80: 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
dd90: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
dda0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
ddb0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
ddc0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
ddd0: 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20 73 71  turn 0;.  v = sq
dde0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
ddf0: 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  rse);.  n = pLis
de00: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
de10: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
de20: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
de30: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
de40: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
de50: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
de60: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
de70: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
de80: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
de90: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
dea0: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
deb0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
dec0: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
ded0: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
dee0: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
def0: 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
df00: 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
df10: 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
df20: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
df30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
df40: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
df50: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
df60: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
df70: 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
df80: 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
df90: 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
dfa0: 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
dfb0: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
dfc0: 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
dfd0: 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
dfe0: 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
dff0: 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
e000: 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
e010: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
e020: 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
e030: 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
e040: 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
e050: 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
e060: 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
e070: 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
e080: 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
e090: 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
e0a0: 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
e0b0: 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
e0c0: 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
e0d0: 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
e0e0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
e0f0: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
e100: 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
e110: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
e120: 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
e130: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
e140: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
e150: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
e160: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
e170: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
e180: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
e190: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
e1a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d  ) return;.  op =
e1b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
e1c0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
e1d0: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
e1e0: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
e1f0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e200: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
e210: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
e220: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e230: 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49  Left, d2, !jumpI
e240: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
e250: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
e260: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e270: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
e280: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
e290: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e2a0: 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
e2b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e2c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
e2d0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
e2e0: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
e2f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e300: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
e310: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
e320: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
e330: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
e340: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
e350: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
e360: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e370: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
e380: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
e390: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
e3a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
e3b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
e3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e3d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
e3e0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
e3f0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
e400: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
e410: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
e420: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
e430: 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
e440: 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
e450: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e460: 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
e470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e480: 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
e490: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e4a0: 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
e4b0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
e4c0: 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
e4d0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
e4e0: 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73  OP_Ne );.      s
e4f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e500: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e510: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
e520: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e530: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
e540: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
e550: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
e560: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
e570: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
e580: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
e590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e5a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e5b0: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
e5c0: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
e5d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e5e0: 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
e5f0: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
e600: 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
e610: 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
e620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e630: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e640: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e660: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
e670: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e680: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e690: 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
e6a0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
e6b0: 73 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20  sion "x BETWEEN 
e6c0: 79 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c  y AND z" is impl
e6d0: 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20  emented as:.    
e6e0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20    **.      ** 1 
e6f0: 49 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20  IF (x < y) GOTO 
e700: 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20  3.      ** 2 IF 
e710: 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64  (x <= z) GOTO <d
e720: 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20  est>.      ** 3 
e730: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
e740: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
e750: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
e760: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
e770: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
e780: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
e790: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
e7a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e7b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ode(pParse, pLef
e7c0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e7d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e7e0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
e7f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e800: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
e810: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
e820: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
e830: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
e840: 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a  ht, OP_Lt, 0, !j
e850: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20  umpIfNull);..   
e860: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
e870: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
e880: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
e890: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e8a0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
e8b0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
e8c0: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
e8d0: 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73  ight, OP_Le, des
e8e0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
e8f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e900: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
e910: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
e920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e930: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
e940: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e950: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
e960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e970: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
e980: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
e990: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
e9a0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
e9b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e9c0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
e9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e9e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a  ddOp(v, OP_If, j
e9f0: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
ea00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ea10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ea20: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ea30: 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
ea40: 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
ea50: 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
ea60: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
ea70: 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
ea80: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
ea90: 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
eaa0: 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
eab0: 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
eac0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ead0: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
eae0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
eaf0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
eb00: 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
eb10: 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
eb20: 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
eb30: 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72  fNull is true or
eb40: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
eb50: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66   jumpIfNull is f
eb60: 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  alse..*/.void sq
eb70: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
eb80: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
eb90: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
eba0: 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
ebb0: 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
ebc0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ebd0: 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
ebe0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
ebf0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
ec00: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
ec10: 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
ec20: 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
ec30: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
ec40: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
ec50: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
ec60: 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
ec70: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
ec80: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
ec90: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
eca0: 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
ecb0: 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
ecc0: 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
ecd0: 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
ece0: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
ed00: 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
ed10: 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
ed20: 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
ed30: 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
ed40: 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
ed50: 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
ed60: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
ed70: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
ed90: 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
eda0: 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
edb0: 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
edc0: 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
edd0: 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
ede0: 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
edf0: 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
ee00: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
ee10: 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
ee20: 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
ee30: 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
ee40: 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
ee50: 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
ee60: 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
ee70: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
ee80: 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
ee90: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
eea0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
eeb0: 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
eec0: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
eed0: 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
eee0: 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
eef0: 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
ef00: 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
ef10: 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
ef20: 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
ef30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ef40: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
ef50: 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
ef60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
ef70: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
ef80: 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
ef90: 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
efa0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
efb0: 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
efc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
efd0: 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
efe0: 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
eff0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f000: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
f010: 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
f020: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
f030: 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
f040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
f050: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
f060: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
f070: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
f080: 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
f090: 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
f0a0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
f0b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
f0c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f0d0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
f0e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f0f0: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
f100: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
f110: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
f120: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
f130: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
f140: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
f150: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f160: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
f170: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
f180: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f190: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
f1a0: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
f1b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
f1c0: 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e  ft, d2, !jumpIfN
f1d0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
f1e0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
f1f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
f200: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
f210: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
f220: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f230: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
f240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f250: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
f260: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
f270: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
f280: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f290: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
f2a0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
f2b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f2c0: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
f2d0: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
f2e0: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
f2f0: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
f300: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
f310: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
f320: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f330: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
f340: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
f350: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f360: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
f370: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
f380: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
f390: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
f3a0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
f3b0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
f3c0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
f3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f3e0: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
f3f0: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
f400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f410: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f420: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
f430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f440: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
f450: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
f460: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f470: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
f480: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
f490: 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42  pression is "x B
f4a0: 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e  ETWEEN y AND z".
f4b0: 20 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74   It is implement
f4c0: 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
f4d0: 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78        ** 1 IF (x
f4e0: 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20   >= y) GOTO 3.  
f4f0: 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64      ** 2 GOTO <d
f500: 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20  est>.      ** 3 
f510: 49 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20  IF (x > z) GOTO 
f520: 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a  <dest>.      */.
f530: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
f540: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
f550: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
f560: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
f570: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
f580: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
f590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f5a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f5b0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
f5c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f5d0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
f5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f5f0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
f600: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
f610: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
f620: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f630: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
f640: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
f650: 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61  pRight, OP_Ge, a
f660: 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75  ddr+3, !jumpIfNu
f670: 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ll);..      sqli
f680: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f690: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
f6a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f6b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
f6c0: 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
f6d0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
f6e0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
f6f0: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
f700: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f710: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
f720: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
f730: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
f740: 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74  ght, OP_Gt, dest
f750: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
f760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f770: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
f780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f790: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f7a0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
f7b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f7c0: 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49   OP_IfNot, jumpI
f7d0: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
f7e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f7f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  .  }.}../*.** Do
f800: 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
f810: 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
f820: 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
f830: 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
f840: 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61  ro).** if they a
f850: 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
f860: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   return FALSE if
f870: 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
f880: 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20  any way..*/.int 
f890: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
f8a0: 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
f8b0: 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
f8c0: 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a  .  if( pA==0 ){.
f8d0: 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30      return pB==0
f8e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
f8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
f900: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
f910: 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
f920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f930: 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
f940: 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
f950: 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
f960: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
f970: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
f980: 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
f990: 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
f9a0: 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c   0;.  if( pA->pL
f9b0: 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
f9c0: 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  B->pList==0 ) re
f9d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
f9e0: 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
f9f0: 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  !=pB->pList->nEx
fa00: 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  pr ) return 0;. 
fa10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
fa20: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
fa30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
fa40: 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
fa50: 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61  are(pA->pList->a
fa60: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70  [i].pExpr, pB->p
fa70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
fa80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
fa90: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
faa0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
fab0: 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pB->pList ){.  
fac0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
fad0: 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63    if( pA->pSelec
fae0: 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74  t || pB->pSelect
faf0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
fb00: 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
fb10: 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d  B->iTable || pA-
fb20: 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
fb30: 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30  olumn ) return 0
fb40: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65  ;.  if( pA->toke
fb50: 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n.z ){.    if( p
fb60: 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20  B->token.z==0 ) 
fb70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
fb80: 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70  ( pB->token.n!=p
fb90: 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74  A->token.n ) ret
fba0: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73  urn 0;.    if( s
fbb0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
fbc0: 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e  A->token.z, pB->
fbd0: 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b  token.z, pB->tok
fbe0: 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72  en.n)!=0 ) retur
fbf0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
fc00: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
fc10: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
fc20: 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
fc30: 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  Agg[] array and 
fc40: 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78  return its index
fc50: 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6c 65  ..** The new ele
fc60: 6d 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69  ment is initiali
fc70: 7a 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  zed to zero.  Th
fc80: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
fc90: 6f 6e 20 69 73 0a 2a 2a 20 65 78 70 65 63 74 65  on is.** expecte
fca0: 64 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  d to fill it in.
fcb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
fcc0: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72  ppendAggInfo(Par
fcd0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
fce0: 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67  f( (pParse->nAgg
fcf0: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
fd00: 20 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72    int amt = pPar
fd10: 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20  se->nAgg + 8;.  
fd20: 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20    AggExpr *aAgg 
fd30: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
fd40: 70 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d  pParse->aAgg, am
fd50: 74 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  t*sizeof(pParse-
fd60: 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20  >aAgg[0]));.    
fd70: 69 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20  if( aAgg==0 ){. 
fd80: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
fd90: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
fda0: 2d 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20  ->aAgg = aAgg;. 
fdb0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61   }.  memset(&pPa
fdc0: 72 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65  rse->aAgg[pParse
fdd0: 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65  ->nAgg], 0, size
fde0: 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  of(pParse->aAgg[
fdf0: 30 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  0]));.  return p
fe00: 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d  Parse->nAgg++;.}
fe10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
fe20: 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
fe30: 6b 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64  kExprTree() used
fe40: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a   to implement .*
fe50: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  * sqlite3ExprAna
fe60: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
fe70: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
fe80: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
fe90: 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
fea0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
feb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
fec0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
fed0: 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
fee0: 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a  ction at pExpr..
fef0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
ff00: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76  alyzeAggregate(v
ff10: 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
ff20: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
ff30: 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67  ;.  AggExpr *aAg
ff40: 67 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  g;.  NameContext
ff50: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
ff60: 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50  text *)pArg;.  P
ff70: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
ff80: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
ff90: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
ffa0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
ffb0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
ffc0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
ffd0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
ffe0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 53       for(i=0; pS
fff0: 72 63 4c 69 73 74 20 26 26 20 69 3c 70 53 72 63  rcList && i<pSrc
10000 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
10010 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
10020 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
10030 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
10040 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
10050 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e   aAgg = pParse->
10060 61 41 67 67 3b 0a 20 20 20 20 20 20 20 20 20 20  aAgg;.          
10070 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
10080 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
10090 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
100a0 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
100b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
100c0 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d       if( aAgg[i]
100d0 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d  .pExpr->iTable==
100e0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
100f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 61 41             && aA
10100 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  gg[i].pExpr->iCo
10110 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
10120 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
10130 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10160 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
10170 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nAgg ){.        
10180 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
10190 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
101a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
101b0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
101c0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
101d0 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
101e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
101f0 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
10200 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
10210 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10220 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
10230 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  gg = i;.        
10240 20 20 70 45 78 70 72 2d 3e 69 41 67 67 43 74 78    pExpr->iAggCtx
10250 20 3d 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3b 0a   = pNC->nDepth;.
10260 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10270 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
10280 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
10290 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
102a0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
102b0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  TION: {.      if
102c0 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
102d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 41 67 67   ){.        aAgg
102e0 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
102f0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
10300 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
10310 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
10320 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69    if( !aAgg[i].i
10330 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
10340 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
10350 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
10360 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c  e(aAgg[i].pExpr,
10370 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20   pExpr) ){.     
10380 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
103a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
103b0 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
103c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
103d0 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
103e0 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  ->enc;.         
103f0 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
10400 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
10410 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20        if( i<0 ) 
10420 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
10430 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
10440 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20  [i].isAgg = 1;. 
10450 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
10460 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
10470 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
10480 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
10490 5d 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ].pFunc = sqlite
104a0 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
104b0 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
104c0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
104d0 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
104e0 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20  token.n,.       
104f0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
10500 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
10510 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
10520 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
10530 20 7d 0a 20 20 20 20 20 20 20 20 70 45 78 70 72   }.        pExpr
10540 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
10550 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10560 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10570 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
10580 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d  lect ){.    pNC-
10590 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77  >nDepth++;.    w
105a0 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45  alkSelectExpr(pE
105b0 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e  xpr->pSelect, an
105c0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
105d0 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e  pNC);.    pNC->n
105e0 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72  Depth--;.  }.  r
105f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
10600 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
10610 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
10620 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
10630 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
10640 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
10650 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
10660 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
10670 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
10680 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
10690 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
106a0 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
106b0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
106c0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
106d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
106e0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
106f0 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
10700 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
10710 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
10720 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  y sqlite3ExprRes
10730 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a  olveNames()..**.
10740 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65  ** If errors are
10750 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20   seen, leave an 
10760 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
10770 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74   zErrMsg and ret
10780 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
10790 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
107a0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  int sqlite3ExprA
107b0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
107c0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
107d0 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
107e0 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e  .  int nErr = pN
107f0 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  C->pParse->nErr;
10800 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
10810 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67  pExpr, analyzeAg
10820 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20  gregate, pNC);. 
10830 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61   return pNC->pPa
10840 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72  rse->nErr - nErr
10850 3b 0a 7d 0a                                      ;.}.