/ Hex Artifact Content
Login

Artifact 0e158f7cc8df562320faa9f2de48cfd856458a52:


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 33 20 32 30 30 35 2f 30 37 2f 32 31 20  .213 2005/07/21 
0220: 31 38 3a 32 33 3a 32 30 20 64 72 68 20 45 78 70  18:23:20 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a 20  ( op==TK_AS ){. 
04d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
04e0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
04f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d  xpr->pLeft);.  }
0500: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0510: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
0520: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
0530: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53  finity(pExpr->pS
0540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
0550: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [0].pExpr);.  }.
0560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0570: 4d 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f  MIT_CAST.  if( o
0580: 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20  p==TK_CAST ){.  
0590: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
05a0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
05b0: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d  xpr->token);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
05d0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
05e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
05f0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  n the default co
0600: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0610: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0620: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0630: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0640: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74  ault collation t
0650: 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ype, return 0..*
0660: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
0670: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61  e3ExprCollSeq(Pa
0680: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0690: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
06a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
06b0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
06c0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70      pColl = pExp
06d0: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  r->pColl;.    if
06e0: 28 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ( (pExpr->op==TK
06f0: 5f 41 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _AS || pExpr->op
0700: 3d 3d 54 4b 5f 43 41 53 54 29 20 26 26 20 21 70  ==TK_CAST) && !p
0710: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
0720: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0730: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0740: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
0750: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
0760: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
0770: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0780: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0790: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
07a0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
07b0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
07c0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
07d0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
07e0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
07f0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0800: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0810: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
0820: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
0830: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0840: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
0850: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
0860: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0870: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0880: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0890: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
08a0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
08b0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
08c0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
08d0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
08e0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
08f0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0900: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0910: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
0920: 68 61 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a 20  has numeric or. 
0930: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66     ** integer af
0940: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
0950: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
0960: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
0970: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31   */.    if( aff1
0980: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
0990: 45 47 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51  EGER || aff2==SQ
09a0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
09b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
09c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
09d0: 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  GER;.    }else i
09e0: 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f  f( aff1==SQLITE_
09f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
0a00: 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff2==SQLITE_AFF_
0a10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
0a20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0a30: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
0a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
0a50: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0a60: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
0a70: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0a80: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0a90: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0aa0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0ab0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0ac0: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0ad0: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0ae0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20  ..    */.    /* 
0af0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0b00: 46 5f 4e 55 4d 45 52 49 43 3b 20 20 2f 2f 20 54  F_NUMERIC;  // T
0b10: 69 63 6b 65 74 20 23 38 30 35 20 2a 2f 0a 20 20  icket #805 */.  
0b20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0b30: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
0b40: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
0b50: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
0b60: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
0b70: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
0b80: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
0b90: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
0ba0: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
0bb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
0bc0: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
0bd0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0be0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0bf0: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
0c00: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
0c10: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
0c20: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
0c30: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
0c40: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
0c50: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
0c60: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
0c70: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
0c80: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
0c90: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
0ca0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0cb0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
0cc0: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
0cd0: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
0ce0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
0cf0: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
0d00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
0d10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
0d20: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0d30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29  xpr->op==TK_NE )
0d40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
0d50: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
0d60: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
0d70: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
0d80: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
0d90: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
0da0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
0db0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
0dc0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
0dd0: 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69  f);.  }.  else i
0de0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
0df0: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
0e00: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
0e10: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65  inity(pExpr->pSe
0e20: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0e30: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
0e40: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21    }.  else if( !
0e50: 61 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d  aff ){.    aff =
0e60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
0e70: 52 49 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  RIC;.  }.  retur
0e80: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
0e90: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
0ea0: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
0eb0: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
0ec0: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
0ed0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
0ee0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
0ef0: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
0f00: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
0f10: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
0f20: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
0f30: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
0f40: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
0f50: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
0f60: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
0f70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
0f80: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
0f90: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
0fa0: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
0fb0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
0fc0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
0fd0: 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a  xpr);.  return .
0fe0: 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45      (aff==SQLITE
0ff0: 5f 41 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20  _AFF_NONE) ||.  
1000: 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41    (aff==SQLITE_A
1010: 46 46 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64  FF_NUMERIC && id
1020: 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  x_affinity==SQLI
1030: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20  TE_AFF_INTEGER) 
1040: 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c  ||.    (aff==SQL
1050: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
1060: 26 26 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  && idx_affinity=
1070: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
1080: 52 49 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66  RIC) ||.    (aff
1090: 3d 3d 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  ==idx_affinity);
10a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10b0: 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 74 68   the P1 value th
10c0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
10d0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
10e0: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
10f0: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
1100: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
1110: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1120: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66  nd pExpr2..** If
1130: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74   jumpIfNull is t
1140: 72 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68  rue, then set th
1150: 65 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68  e low byte of th
1160: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31  e returned.** P1
1170: 20 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74   value to tell t
1180: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d  he opcode to jum
1190: 70 20 69 66 20 65 69 74 68 65 72 20 65 78 70 72  p if either expr
11a0: 65 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61  ession.** evalua
11b0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a  tes to NULL..*/.
11c0: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72  static int binar
11d0: 79 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20  yCompareP1(Expr 
11e0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
11f0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
1200: 66 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61  fNull){.  char a
1210: 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
1220: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
1230: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e 74  ;.  return ((int
1240: 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41  )sqlite3CompareA
1250: 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20  ffinity(pExpr1, 
1260: 61 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75 6c  aff))+(jumpIfNul
1270: 6c 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f  l?0x100:0);.}../
1280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1290: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c  inter to the col
12a0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12b0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
12c0: 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61  sed by.** a bina
12d0: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  ry comparison op
12e0: 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67  erator comparing
12f0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
1300: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1310: 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73  left hand expres
1320: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1330: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79  ting sequence ty
1340: 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a  pe, then it is.*
1350: 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73  * used. Otherwis
1360: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
1370: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
1380: 20 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72   right hand expr
1390: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65  ession.** is use
13a0: 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c  d, or the defaul
13b0: 74 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65  t (BINARY) if ne
13c0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
13d0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
13e0: 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  .** type..*/.sta
13f0: 74 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e  tic CollSeq* bin
1400: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1410: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
1420: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
1430: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43  pr *pRight){.  C
1440: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1450: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1460: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
1470: 29 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  );.  if( !pColl 
1480: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
1490: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
14a0: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
14b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14c0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
14d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
14e0: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
14f0: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
1500: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
1510: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
1520: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
1530: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
1540: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
1550: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1560: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
1570: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
1580: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
1590: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
15a0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
15b0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
15c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
15d0: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
15e0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
15f0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1600: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
1610: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1620: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
1630: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
1640: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
1650: 7b 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e  {.  int p1 = bin
1660: 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65  aryCompareP1(pLe
1670: 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70  ft, pRight, jump
1680: 49 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53  IfNull);.  CollS
1690: 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43  eq *p3 = binaryC
16a0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
16b0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
16c0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ght);.  return s
16d0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 50  qlite3VdbeOp3(pP
16e0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
16f0: 6f 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28  ode, p1, dest, (
1700: 76 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c  void*)p3, P3_COL
1710: 4c 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSEQ);.}../*.** 
1720: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
1730: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1740: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1750: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
1760: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
1770: 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64  node is obtained
1780: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1790: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
17a0: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
17b0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
17c0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
17d0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
17e0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f  y gets freed..*/
17f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1800: 70 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20  pr(int op, Expr 
1810: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
1820: 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65  ight, const Toke
1830: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
1840: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
1850: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1860: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
1870: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1880: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61  {.    /* When ma
1890: 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65  lloc fails, dele
18a0: 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  te pLeft and pRi
18b0: 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73  ght. Expressions
18c0: 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20   passed to .    
18d0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
18e0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
18f0: 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73  allocated with s
1900: 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72  qlite3Expr() for
1910: 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65   this .    ** re
1920: 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ason. .    */.  
1930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1940: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
1950: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1960: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  e(pRight);.    r
1970: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1980: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
1990: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
19a0: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
19b0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
19c0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
19d0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
19e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
19f0: 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20  ken->dyn==0 );. 
1a00: 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20     pNew->span = 
1a10: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
1a20: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  Token;.  }else i
1a30: 66 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67  f( pLeft && pRig
1a40: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
1a50: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
1a60: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
1a70: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
1a80: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
1a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  .}../*.** When d
1aa0: 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61  oing a nested pa
1ab0: 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63  rse, you can inc
1ac0: 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  lude terms in an
1ad0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
1ae0: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
1af0: 69 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e  is:   #0 #1 #2 .
1b00: 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  ..  These terms 
1b10: 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74  refer to element
1b20: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  s.** on the stac
1b30: 6b 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74  k.  "#0" means t
1b40: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
1b50: 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61  ack..** "#1" mea
1b60: 6e 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e  ns the next down
1b70: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
1b80: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
1b90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ba0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1bb0: 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c  e parser to deal
1bc0: 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73   with on of thos
1bd0: 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69  e terms..** It i
1be0: 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72  mmediately gener
1bf0: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f  ates code to sto
1c00: 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
1c10: 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  a memory locatio
1c20: 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  n..** The return
1c30: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
1c40: 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74  that will code t
1c50: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1c60: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74  lue from.** that
1c70: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1c80: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45   as needed..*/.E
1c90: 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69  xpr *sqlite3Regi
1ca0: 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20 2a  sterExpr(Parse *
1cb0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1cc0: 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a  Token){.  Vdbe *
1cd0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ce0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  e;.  Expr *p;.  
1cf0: 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28  int depth;.  if(
1d00: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
1d10: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1d20: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
1d30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d40: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
1d50: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
1d60: 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  ror", pToken);. 
1d70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1d80: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
1d90: 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c 20  pr(TK_REGISTER, 
1da0: 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  0, 0, pToken);. 
1db0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
1dc0: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d   return 0;  /* M
1dd0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
1de0: 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61 74    }.  depth = at
1df0: 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  oi(&pToken->z[1]
1e00: 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  );.  p->iTable =
1e10: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
1e20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1e30: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64  dOp(v, OP_Dup, d
1e40: 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69  epth, 0);.  sqli
1e50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1e60: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e  OP_MemStore, p->
1e70: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65  iTable, 1);.  re
1e80: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1e90: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
1ea0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
1eb0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
1ec0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1ed0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
1ee0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1ef0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
1f00: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
1f10: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
1f20: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1f30: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
1f40: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
1f50: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
1f60: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1f70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1f80: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
1f90: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
1fa0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1fb0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1fc0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1fd0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
1fe0: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
1ff0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2000: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
2010: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
2020: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
2030: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
2040: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
2050: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
2060: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
2070: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
2080: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2090: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
20a0: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
20b0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
20c0: 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26   && pRight->z &&
20d0: 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20   pLeft->z ){.   
20e0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
20f0: 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d  dyn==0 || pLeft-
2100: 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20  >z[pLeft->n]==0 
2110: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
2120: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
2130: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
2140: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2150: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
2160: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2170: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
2180: 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65  (pRight->z - pLe
2190: 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ft->z);.    }els
21a0: 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e{.      pExpr->
21b0: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  span.z = 0;.    
21c0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
21d0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
21e0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
21f0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
2200: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
2210: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
2220: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
2230: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
2240: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
2250: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
2260: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73  pNew;.  pNew = s
2270: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
2280: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
2290: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22b0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 20  tDelete(pList); 
22c0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
22d0: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
22e0: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
22f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2300: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
2310: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
2320: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
2330: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
2340: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
2350: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
2360: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
2370: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65  *pToken;.  }else
2380: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
2390: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  n.z = 0;.  }.  p
23a0: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
23b0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72  ->token;.  retur
23c0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
23d0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
23e0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
23f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
2400: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
2410: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
2420: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
2430: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
2440: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
2450: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
2460: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
2470: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
2480: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
2490: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
24a0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
24b0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
24c0: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
24d0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
24e0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
24f0: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
2500: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
2510: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
2520: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
2530: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
2540: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
2550: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
2560: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
2570: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
2580: 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69   "$aaa" are assi
2590: 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75  gned the same nu
25a0: 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70  mber.** as the p
25b0: 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65  revious instance
25c0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c   of the same wil
25d0: 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68  dcard.  Or if th
25e0: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
25f0: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
2600: 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65  he wildcard, the
2610: 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20   next sequenial 
2620: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2630: 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a  is.** assigned..
2640: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2650: 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62  xprAssignVarNumb
2660: 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
2670: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2680: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b    Token *pToken;
2690: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
26a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
26b0: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
26c0: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
26d0: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
26e0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
26f0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
2700: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
2710: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
2720: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
2730: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2740: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
2750: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
2760: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2770: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2780: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
2790: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
27a0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
27b0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
27c0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
27d0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
27e0: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
27f0: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
2800: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
2810: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
2820: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
2830: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2840: 20 69 20 3d 20 61 74 6f 69 28 26 70 54 6f 6b 65   i = atoi(&pToke
2850: 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 69 66  n->z[1]);.    if
2860: 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c 49 54  ( i<1 || i>SQLIT
2870: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
2880: 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20 20 73  UMBER ){.      s
2890: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28a0: 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65  Parse, "variable
28b0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20   number must be 
28c0: 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f  between ?1 and ?
28d0: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 53  %d",.          S
28e0: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
28f0: 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 20 20  LE_NUMBER);.    
2900: 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72  }.    if( i>pPar
2910: 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20  se->nVar ){.    
2920: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
2930: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   i;.    }.  }els
2940: 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  e{.    /* Wildca
2950: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
2960: 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22  ":aaa" or "$aaa"
2970: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
2980: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  e variable.    *
2990: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
29a0: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
29b0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
29c0: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
29d0: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76  e.    ** has nev
29e0: 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f  er appeared befo
29f0: 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61  re, reuse the sa
2a00: 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  me variable numb
2a10: 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  er.    */.    in
2a20: 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
2a30: 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66  pToken->n;.    f
2a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
2a50: 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b 29  ->nVarExpr; i++)
2a60: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
2a70: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 20  ;.      if( (pE 
2a80: 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  = pParse->apVarE
2a90: 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20  xpr[i])!=0.     
2aa0: 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65       && pE->toke
2ab0: 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20  n.n==n.         
2ac0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74   && memcmp(pE->t
2ad0: 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  oken.z, pToken->
2ae0: 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  z, n)==0 ){.    
2af0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2b00: 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a  e = pE->iTable;.
2b10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b30: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
2b40: 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20  nVarExpr ){.    
2b50: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2b60: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  = ++pParse->nVar
2b70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
2b80: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50  se->nVarExpr>=pP
2b90: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
2ba0: 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  loc-1 ){.       
2bb0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
2bc0: 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65  rAlloc += pParse
2bd0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20  ->nVarExprAlloc 
2be0: 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50  + 10;.        pP
2bf0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20  arse->apVarExpr 
2c00: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
2c10: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2c20: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2c30: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
2c40: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
2c50: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
2c60: 70 56 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a  pVarExpr[0]) );.
2c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c80: 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ( !sqlite3_mallo
2c90: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
2ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
2cb0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30  se->apVarExpr!=0
2cc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
2cd0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50  se->apVarExpr[pP
2ce0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b  arse->nVarExpr++
2cf0: 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  ] = pExpr;.     
2d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a   }.    }.  } .}.
2d10: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
2d20: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
2d30: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
2d40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2d50: 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29  rDelete(Expr *p)
2d60: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
2d70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
2d80: 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  span.dyn ) sqlit
2d90: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  eFree((char*)p->
2da0: 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70  span.z);.  if( p
2db0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71  ->token.dyn ) sq
2dc0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
2dd0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73  p->token.z);.  s
2de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2df0: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71  (p->pLeft);.  sq
2e00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2e10: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71  p->pRight);.  sq
2e20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2e30: 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  ete(p->pList);. 
2e40: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2e50: 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29  lete(p->pSelect)
2e60: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
2e70: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
2e80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70   following group
2e90: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b   of routines mak
2ea0: 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66  e deep copies of
2eb0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a   expressions,.**
2ec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
2ed0: 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64  s, ID lists, and
2ee0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
2ef0: 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20  ts.  The copies 
2f00: 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65  can.** be delete
2f10: 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73  d (by being pass
2f20: 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70  ed to their resp
2f30: 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65  ective ...Delete
2f40: 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20  () routines).** 
2f50: 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e  without effectin
2f60: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e  g the originals.
2f70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  .**.** The expre
2f80: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20  ssion list, ID, 
2f90: 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73  and source lists
2fa0: 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74   return by sqlit
2fb0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c  e3ExprListDup(),
2fc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73  .** sqlite3IdLis
2fd0: 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69  tDup(), and sqli
2fe0: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20  te3SrcListDup() 
2ff0: 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68  can not be furth
3000: 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20  er expanded .** 
3010: 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
3020: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69  lls to sqlite*Li
3030: 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69  stAppend() routi
3040: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74  nes..**.** Any t
3050: 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53  ables that the S
3060: 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69  rcList might poi
3070: 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75  nt to are not du
3080: 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78 70  plicated..*/.Exp
3090: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
30a0: 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 45 78  p(Expr *p){.  Ex
30b0: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  pr *pNew;.  if( 
30c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
30d0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
30e0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
30f0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
3100: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
3110: 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  0;.  memcpy(pNew
3120: 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , p, sizeof(*pNe
3130: 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  w));.  if( p->to
3140: 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  ken.z!=0 ){.    
3150: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  pNew->token.z = 
3160: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 2d  sqliteStrNDup(p-
3170: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b  >token.z, p->tok
3180: 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  en.n);.    pNew-
3190: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a  >token.dyn = 1;.
31a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
31b0: 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  ert( pNew->token
31c0: 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  .z==0 );.  }.  p
31d0: 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b  New->span.z = 0;
31e0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d  .  pNew->pLeft =
31f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3200: 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65  p->pLeft);.  pNe
3210: 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  w->pRight = sqli
3220: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 52  te3ExprDup(p->pR
3230: 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ight);.  pNew->p
3240: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
3250: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c 69  prListDup(p->pLi
3260: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65  st);.  pNew->pSe
3270: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
3280: 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c 65  lectDup(p->pSele
3290: 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 54 61  ct);.  pNew->pTa
32a0: 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20 72  b = p->pTab;.  r
32b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f  eturn pNew;.}.vo
32c0: 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43  id sqlite3TokenC
32d0: 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  opy(Token *pTo, 
32e0: 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20  Token *pFrom){. 
32f0: 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20   if( pTo->dyn ) 
3300: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
3310: 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28  *)pTo->z);.  if(
3320: 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20   pFrom->z ){.   
3330: 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d   pTo->n = pFrom-
3340: 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  >n;.    pTo->z =
3350: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
3360: 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e  From->z, pFrom->
3370: 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e  n);.    pTo->dyn
3380: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3390: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20     pTo->z = 0;. 
33a0: 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73   }.}.ExprList *s
33b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
33c0: 70 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a  p(ExprList *p){.
33d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
33e0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
33f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
3400: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
3410: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
3420: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3430: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3440: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
3450: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3460: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3470: 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70 4e  pNew->nExpr = pN
3480: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3490: 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e 61  nExpr;.  pNew->a
34a0: 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74   = pItem = sqlit
34b0: 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78 70  eMalloc( p->nExp
34c0: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  r*sizeof(p->a[0]
34d0: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
34e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
34f0: 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
3500: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a   return 0;.  } .
3510: 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e    pOldItem = p->
3520: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
3530: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
3540: 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d  Item++, pOldItem
3550: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3560: 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78  NewExpr, *pOldEx
3570: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
3580: 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20  Expr = pNewExpr 
3590: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
35a0: 28 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64  (pOldExpr = pOld
35b0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
35c0: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e    if( pOldExpr->
35d0: 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65  span.z!=0 && pNe
35e0: 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f  wExpr ){.      /
35f0: 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20  * Always make a 
3600: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e  copy of the span
3610: 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65   for top-level e
3620: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
3630: 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
3640: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
3650: 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54   logic in SELECT
3660: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
3670: 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20   determines.    
3680: 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f    ** the names o
3690: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
36a0: 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64   result set need
36b0: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
36c0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
36d0: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e  te3TokenCopy(&pN
36e0: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
36f0: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
3700: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
3710: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
3720: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
3730: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
3740: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
3750: 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69  pan.z==0 || sqli
3760: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
3770: 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  d );.    pItem->
3780: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
3790: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a  rDup(pOldItem->z
37a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
37b0: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  ->sortOrder = pO
37c0: 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  ldItem->sortOrde
37d0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73  r;.    pItem->is
37e0: 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Agg = pOldItem->
37f0: 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d  isAgg;.    pItem
3800: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ->done = 0;.  }.
3810: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3820: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ../*.** If curso
3830: 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69  rs, triggers, vi
3840: 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  ews and subqueri
3850: 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74  es are all omitt
3860: 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62  ed from.** the b
3870: 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20  uild, then none 
3880: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3890: 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70   routines, excep
38a0: 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65  t for .** sqlite
38b0: 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61  3SelectDup(), ca
38c0: 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c  n be called. sql
38d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20  ite3SelectDup() 
38e0: 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  is sometimes.** 
38f0: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55  called with a NU
3900: 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  LL argument..*/.
3910: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
3920: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
3930: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
3940: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
3950: 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  \. || !defined(S
3960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
3970: 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71  ERY).SrcList *sq
3980: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
3990: 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53  SrcList *p){.  S
39a0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
39b0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
39c0: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
39d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
39e0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
39f0: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
3a00: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
3a10: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
3a20: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
3a30: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79  teMallocRaw( nBy
3a40: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
3a50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3a60: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
3a70: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
3a80: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
3a90: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
3aa0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
3ab0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
3ac0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
3ad0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
3ae0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
3af0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
3b00: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
3b10: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
3b20: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
3b30: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
3b40: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
3b50: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
3b60: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
3b70: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  up(pOldItem->zNa
3b80: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
3b90: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
3ba0: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3bb0: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
3bc0: 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pNewItem->jointy
3bd0: 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a  pe = pOldItem->j
3be0: 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65  ointype;.    pNe
3bf0: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
3c00: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
3c10: 6f 72 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  or;.    pTab = p
3c20: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
3c30: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
3c40: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
3c50: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
3c60: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
3c70: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
3c80: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
3c90: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  up(pOldItem->pSe
3ca0: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49  lect);.    pNewI
3cb0: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
3cc0: 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74  e3ExprDup(pOldIt
3cd0: 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e  em->pOn);.    pN
3ce0: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
3cf0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
3d00: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  p(pOldItem->pUsi
3d10: 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  ng);.    pNewIte
3d20: 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c  m->colUsed = pOl
3d30: 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  dItem->colUsed;.
3d40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3d50: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
3d60: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64  ite3IdListDup(Id
3d70: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
3d80: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
3d90: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
3da0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3db0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
3dc0: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  aw( sizeof(*pNew
3dd0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
3de0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3df0: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65   pNew->nId = pNe
3e00: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
3e10: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
3e20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3e30: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
3e40: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
3e50: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20   pNew->a==0 ){. 
3e60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e     sqliteFree(pN
3e70: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
3e80: 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
3e90: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
3ea0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
3eb0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
3ec0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
3ed0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
3ee0: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
3ef0: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
3f00: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
3f10: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
3f20: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
3f30: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
3f40: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
3f50: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
3f60: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
3f70: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
3f80: 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b  tDup(Select *p){
3f90: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
3fa0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
3fb0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
3fc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3fd0: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
3fe0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
3ff0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
4000: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
4010: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
4020: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
4030: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
4040: 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  p(p->pEList);.  
4050: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
4060: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70  ite3SrcListDup(p
4070: 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d  ->pSrc);.  pNew-
4080: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
4090: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65  3ExprDup(p->pWhe
40a0: 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  re);.  pNew->pGr
40b0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
40c0: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47  xprListDup(p->pG
40d0: 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d  roupBy);.  pNew-
40e0: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
40f0: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61  e3ExprDup(p->pHa
4100: 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ving);.  pNew->p
4110: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
4120: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
4130: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65  pOrderBy);.  pNe
4140: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
4150: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
4160: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
4170: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70  (p->pPrior);.  p
4180: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
4190: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
41a0: 70 4c 69 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d  pLimit);.  pNew-
41b0: 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74  >pOffset = sqlit
41c0: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4f 66  e3ExprDup(p->pOf
41d0: 66 73 65 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69  fset);.  pNew->i
41e0: 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e  Limit = -1;.  pN
41f0: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31  ew->iOffset = -1
4200: 3b 0a 20 20 70 4e 65 77 2d 3e 70 70 4f 70 65 6e  ;.  pNew->ppOpen
4210: 56 69 72 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70  Virtual = 0;.  p
4220: 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20  New->isResolved 
4230: 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 3b  = p->isResolved;
4240: 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67 20 3d  .  pNew->isAgg =
4250: 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 72 65 74   p->isAgg;.  ret
4260: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73  urn pNew;.}.#els
4270: 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  e.Select *sqlite
4280: 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63  3SelectDup(Selec
4290: 74 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t *p){.  assert(
42a0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
42b0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
42c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
42d0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
42e0: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
42f0: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
4300: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
4310: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
4320: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
4330: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
4340: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
4350: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
4360: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
4370: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f   Expr *pExpr, To
4380: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4390: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
43a0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
43b0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
43c0: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
43d0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
43e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
43f0: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  em;.    }.    as
4400: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c  sert( pList->nAl
4410: 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  loc==0 );.  }.  
4420: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  if( pList->nAllo
4430: 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  c<=pList->nExpr 
4440: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
4450: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
4460: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
4470: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
4480: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52  .    a = sqliteR
4490: 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c  ealloc(pList->a,
44a0: 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d   n*sizeof(pList-
44b0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
44c0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67   a==0 ){.      g
44d0: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
44e0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
44f0: 20 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   a;.    pList->n
4500: 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20 7d 0a 20  Alloc = n;.  }. 
4510: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
4520: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  a!=0 );.  if( pE
4530: 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a  xpr || pName ){.
4540: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
4550: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
4560: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
4570: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
4580: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
4590: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
45a0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  );.    pItem->zN
45b0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
45c0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
45d0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
45e0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
45f0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
4600: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
4610: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
4620: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
4630: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
4640: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
4650: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 0a 20 20  elete(pExpr);.  
4660: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4670: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
4680: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4690: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
46a0: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
46b0: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
46c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
46d0: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
46e0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
46f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
4700: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
4710: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
4720: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4730: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28  pList->a!=0 || (
4740: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
4750: 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  && pList->nAlloc
4760: 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
4770: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  ( pList->nExpr<=
4780: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b  pList->nAlloc );
4790: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
47a0: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
47b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
47c0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
47d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
47e0: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  (pItem->pExpr);.
47f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4800: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
4810: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4820: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
4830: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
4840: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
4850: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
4860: 20 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72    Call xFunc for
4870: 20 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74   each node visit
4880: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
4890: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
48a0: 78 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73  xFunc determines
48b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65   whether the tre
48c0: 65 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73  e walk continues
48d0: 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e  ..** 0 means con
48e0: 74 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68  tinue walking th
48f0: 65 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73  e tree.  1 means
4900: 20 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69   do not walk chi
4910: 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ldren.** of the 
4920: 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74  current node but
4930: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73   continue with s
4940: 69 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e  iblings.  2 mean
4950: 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65  s abandon.** the
4960: 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c   tree walk compl
4970: 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etely..**.** The
4980: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
4990: 6f 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  om this routine 
49a0: 69 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20  is 1 to abandon 
49b0: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a  the tree walk.**
49c0: 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e   and 0 to contin
49d0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
49e0: 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45  t walkExprList(E
49f0: 78 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28  xprList *, int (
4a00: 2a 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  *)(void *, Expr*
4a10: 29 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74  ), void *);.stat
4a20: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54  ic int walkExprT
4a30: 72 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ree(Expr *pExpr,
4a40: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
4a50: 69 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64  id*,Expr*), void
4a60: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
4a70: 63 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  c;.  if( pExpr==
4a80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4a90: 72 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41  rc = (*xFunc)(pA
4aa0: 72 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  rg, pExpr);.  if
4ab0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
4ac0: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
4ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46  pExpr->pLeft, xF
4ae0: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4af0: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77  urn 1;.    if( w
4b00: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
4b10: 72 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63  r->pRight, xFunc
4b20: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
4b30: 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   1;.    if( walk
4b40: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
4b50: 70 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41  pList, xFunc, pA
4b60: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e    }.  return rc>
4b80: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  1;.}../*.** Call
4b90: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
4ba0: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
4bb0: 73 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a  sion in list p..
4bc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
4bd0: 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  lkExprList(ExprL
4be0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ist *p, int (*xF
4bf0: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
4c00: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
4c10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
4c20: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4c30: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
4c40: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
4c50: 20 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c   for(i=p->nExpr,
4c60: 20 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30   pItem=p->a; i>0
4c70: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
4c80: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4c90: 72 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78  rTree(pItem->pEx
4ca0: 70 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  pr, xFunc, pArg)
4cb0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
4cc0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4cd0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45  /*.** Call walkE
4ce0: 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76  xprTree() for ev
4cf0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
4d00: 6e 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20  n Select p, not 
4d10: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70  including.** exp
4d20: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
4d30: 65 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65  e part of sub-se
4d40: 6c 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f  lects in any FRO
4d50: 4d 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20  M clause or the 
4d60: 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53  LIMIT.** or OFFS
4d70: 45 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e  ET expressions..
4d80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4d90: 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65  alkSelectExpr(Se
4da0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78  lect *p, int (*x
4db0: 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78  Func)(void *, Ex
4dc0: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  pr*), void *pArg
4dd0: 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  ){.  walkExprLis
4de0: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75  t(p->pEList, xFu
4df0: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
4e00: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68  kExprTree(p->pWh
4e10: 65 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ere, xFunc, pArg
4e20: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  );.  walkExprLis
4e30: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78  t(p->pGroupBy, x
4e40: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
4e50: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70  alkExprTree(p->p
4e60: 48 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70  Having, xFunc, p
4e70: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
4e80: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
4e90: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
4ea0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
4eb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4ec0: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
4ed0: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
4ee0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
4ef0: 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61  *.** pArg is rea
4f00: 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
4f10: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66   an integer.  If
4f20: 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20   we can tell by 
4f30: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45  looking.** at pE
4f40: 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70  xpr that the exp
4f50: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
4f60: 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e  tains pExpr is n
4f70: 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ot a constant.**
4f80: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4f90: 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30  n set *pArg to 0
4fa0: 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f   and return 2 to
4fb0: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
4fc0: 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45  e walk..** If pE
4fd0: 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f  xpr does does no
4fe0: 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65  t disqualify the
4ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
5000: 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e   being a constan
5010: 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74  t.** then do not
5020: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  hing..**.** Afte
5030: 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68  r walking the wh
5040: 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20  ole tree, if no 
5050: 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20  nodes are found 
5060: 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a  that disqualify.
5070: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
5080: 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n as constant, t
5090: 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68  hen we assume th
50a0: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
50b0: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e  on.** is constan
50c0: 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  t.  See sqlite3E
50d0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
50e0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
50f0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
5100: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
5110: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69  deIsConstant(voi
5120: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
5130: 45 78 70 72 29 7b 0a 20 20 73 77 69 74 63 68 28  Expr){.  switch(
5140: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
5150: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
5160: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
5170: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
5180: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
5190: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
51a0: 2a 20 61 6e 64 20 2a 70 41 72 67 3d 3d 32 20 2a  * and *pArg==2 *
51b0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  /.    case TK_FU
51c0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66  NCTION:.      if
51d0: 28 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 3d  ( *((int*)pArg)=
51e0: 3d 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =2 ) return 0;. 
51f0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
5200: 6f 75 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65  ough */.    case
5210: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
5220: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20   TK_COLUMN:.    
5230: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20  case TK_DOT:.   
5240: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
5250: 43 54 49 4f 4e 3a 0a 23 69 66 6e 64 65 66 20 53  CTION:.#ifndef S
5260: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5270: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
5280: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
5290: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64   TK_EXISTS:.#end
52a0: 69 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a  if.      *((int*
52b0: 29 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20  )pArg) = 0;.    
52c0: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
52d0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
52e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
52f0: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
5300: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5310: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
5320: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
5330: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
5340: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
5350: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
5360: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
5370: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
5380: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
5390: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
53a0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
53b0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
53c0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
53d0: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
53e0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
53f0: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
5400: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
5410: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
5420: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
5430: 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73  p){.  int isCons
5440: 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70  t = 1;.  walkExp
5450: 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64  rTree(p, exprNod
5460: 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73  eIsConstant, &is
5470: 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  Const);.  return
5480: 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a   isConst;.}../*.
5490: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
54a0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
54b0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
54c0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
54d0: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
54e0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
54f0: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
5500: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
5510: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
5520: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
5530: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
5540: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
5550: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
5560: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
5570: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
5580: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
5590: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
55a0: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
55b0: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
55c0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
55d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
55e0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
55f0: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29  unction(Expr *p)
5600: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
5610: 3d 20 32 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 2;.  walkExprT
5620: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
5630: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
5640: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
5650: 73 43 6f 6e 73 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a  sConst!=0;.}../*
5660: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
5670: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
5680: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
5690: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
56a0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
56b0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
56c0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
56d0: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
56e0: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
56f0: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
5700: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5710: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
5720: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
5730: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
5740: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
5750: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
5760: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
5770: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
5780: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5790: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
57a0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
57b0: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
57c0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
57d0: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
57e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
57f0: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b  3GetInt32(p->tok
5800: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b  en.z, pValue) ){
5810: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5820: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5840: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
5850: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
5860: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
5870: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
5880: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Value);.    }.  
5890: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
58a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
58b0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
58c0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
58d0: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
58e0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
58f0: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
5900: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5910: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5920: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5930: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
5940: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5950: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5960: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
5970: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
5980: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
5990: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
59a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
59b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
59c0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
59d0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
59e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
59f0: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
5a00: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
5a10: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
5a20: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
5a30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
5a40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5a50: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
5a60: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
5a70: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
5a80: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
5a90: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
5aa0: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
5ab0: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
5ac0: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
5ad0: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
5ae0: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
5af0: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
5b00: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
5b10: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
5b20: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
5b30: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
5b40: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
5b50: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
5b60: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
5b70: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
5b80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5b90: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  holding.**      
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a     the table..**
5bc0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
5bd0: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
5be0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
5bf0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5c00: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
5c30: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
5c40: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
5c50: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
5c60: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
5c70: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
5c80: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
5c90: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
5ca0: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
5cb0: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
5cc0: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
5cd0: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
5ce0: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
5cf0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
5d00: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
5d10: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
5d20: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
5d30: 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65  *.** The pDbToke
5d40: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
5d50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
5d60: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
5d70: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
5d80: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
5d90: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
5da0: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
5db0: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
5dc0: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
5dd0: 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62   used.  The pTab
5de0: 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  leToken is the n
5df0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5e00: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
5e10: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
5e20: 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b  e NULL if pDbTok
5e30: 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  en is also NULL.
5e40: 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e    If pTableToken
5e50: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
5e60: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
5e70: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
5e80: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
5e90: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
5ea0: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
5eb0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
5ec0: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
5ed0: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
5ee0: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
5ef0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
5f00: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
5f10: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
5f20: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e    Return zero on
5f30: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
5f40: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
5f50: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
5f60: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
5f70: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
5f80: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
5f90: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
5fa0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
5fb0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
5fc0: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
5fd0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
5fe0: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
5ff0: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
6000: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
6010: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
6020: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
6030: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
6040: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
6050: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
6060: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
6070: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
6080: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
6090: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
60a0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
60b0: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
60c0: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
60d0: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
60e0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
60f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
6100: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
6110: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
6120: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
6130: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
6140: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
6150: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
6160: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
6170: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
6180: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
6190: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
61a0: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
61b0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
61c0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
61d0: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
61e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
61f0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
6200: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
6210: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
6220: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6230: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
6240: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
6250: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6260: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
6270: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72  atabase */.  str
6280: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
6290: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
62a0: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
62b0: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
62c0: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
62d0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
62e0: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
62f0: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
6300: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
6310: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
6320: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
6330: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
6340: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
6350: 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
6360: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26   pColumnToken &&
6370: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
6380: 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20   ); /* The Z in 
6390: 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20  X.Y.Z cannot be 
63a0: 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20  NULL */.  zDb = 
63b0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
63c0: 6f 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a  oken(pDbToken);.
63d0: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33    zTab = sqlite3
63e0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
63f0: 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43  ableToken);.  zC
6400: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
6410: 46 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d  FromToken(pColum
6420: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73  nToken);.  if( s
6430: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
6440: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
6450: 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b   lookupname_end;
6460: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69  .  }..  pExpr->i
6470: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68  Table = -1;.  wh
6480: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
6490: 3d 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  =0 ){.    SrcLis
64a0: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
64b0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
64c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
64d0: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
64e0: 0a 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ..    /* assert(
64f0: 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69   zTab==0 || pELi
6500: 73 74 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20  st==0 ); */.    
6510: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
6520: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
6530: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
6540: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
6550: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
6560: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
6570: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
6580: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 43 6f  pTab;.        Co
6590: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20  lumn *pCol;.  . 
65a0: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d         if( pTab=
65b0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
65c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
65d0: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
65e0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20         if( zTab 
65f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6600: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
6610: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
6620: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
6630: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
6640: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
6650: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
6660: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
6670: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6690: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
66a0: 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
66b0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
66c0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
66d0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
66e0: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
66f0: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
6700: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
6710: 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71  if( zDb!=0 && sq
6720: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
6730: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
6740: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
6750: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6760: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6780: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6790: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e        if( 0==(cn
67a0: 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20  tTab++) ){.     
67b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
67c0: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
67d0: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sor;.          p
67e0: 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62  Expr->iDb = pTab
67f0: 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  ->iDb;.         
6800: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
6810: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6820: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c     for(j=0, pCol
6830: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
6840: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
6850: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
6860: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
6870: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
6880: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
6890: 20 20 20 20 20 20 20 20 20 20 20 49 64 4c 69 73             IdLis
68a0: 74 20 2a 70 55 73 69 6e 67 3b 0a 20 20 20 20 20  t *pUsing;.     
68b0: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
68c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
68d0: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
68e0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
68f0: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
6900: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Item;.          
6910: 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70    pExpr->iDb = p
6920: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20  Tab->iDb;.      
6930: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
6940: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
6950: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
6960: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
6970: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
6980: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6990: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
69a0: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
69b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
69c0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
69d0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
69e0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ity;.           
69f0: 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20   pExpr->pColl = 
6a00: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
6a10: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oll;.           
6a20: 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e   if( pItem->join
6a30: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
6a40: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
6a50: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61     /* If this ma
6a60: 74 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20  tch occurred in 
6a70: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
6a80: 66 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e  f a natural join
6a90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6aa0: 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  ** then skip the
6ab0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f 20   right table to 
6ac0: 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74  avoid a duplicat
6ad0: 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  e match */.     
6ae0: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b           pItem++
6af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6b00: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i++;.           
6b10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
6b20: 66 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74  f( (pUsing = pIt
6b30: 65 6d 2d 3e 70 55 73 69 6e 67 29 21 3d 30 20 29  em->pUsing)!=0 )
6b40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6b50: 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68  /* If this match
6b60: 20 6f 63 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c   occurs on a col
6b70: 75 6d 6e 20 74 68 61 74 20 69 73 20 69 6e 20 74  umn that is in t
6b80: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  he USING clause.
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
6ba0: 20 6f 66 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70   of a join, skip
6bb0: 20 74 68 65 20 73 65 61 72 63 68 20 6f 66 20 74   the search of t
6bc0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
6bd0: 66 20 74 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20  f the join.     
6be0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61           ** to a
6bf0: 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61 74 65  void a duplicate
6c00: 20 6d 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f   match there. */
6c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
6c20: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
6c30: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
6c40: 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29  Using->nId; k++)
6c50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6c60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6c70: 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b  ICmp(pUsing->a[k
6c80: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
6c90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6ca0: 20 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a         pItem++;.
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
6cd0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
6d00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
6d20: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
6d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6d40: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
6d50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
6d60: 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  GER.    /* If we
6d70: 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
6d80: 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e  y resolved the n
6d90: 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  ame, then maybe 
6da0: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20  .    ** it is a 
6db0: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
6dc0: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
6dd0: 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f  reference.    */
6de0: 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20  .    if( zDb==0 
6df0: 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e  && zTab!=0 && cn
6e00: 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  t==0 && pParse->
6e10: 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a  trigStack!=0 ){.
6e20: 20 20 20 20 20 20 54 72 69 67 67 65 72 53 74 61        TriggerSta
6e30: 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63  ck *pTriggerStac
6e40: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  k = pParse->trig
6e50: 53 74 61 63 6b 3b 0a 20 20 20 20 20 20 54 61 62  Stack;.      Tab
6e60: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
6e70: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
6e80: 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d  Stack->newIdx !=
6e90: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
6ea0: 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61  rICmp("new", zTa
6eb0: 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20  b) == 0 ){.     
6ec0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6ed0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
6ee0: 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20  ->newIdx;.      
6ef0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
6f00: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
6f10: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
6f20: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
6f30: 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Tab;.      }else
6f40: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61   if( pTriggerSta
6f50: 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31  ck->oldIdx != -1
6f60: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6f70: 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d  mp("old", zTab)=
6f80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
6f90: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54  xpr->iTable = pT
6fa0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
6fb0: 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Idx;.        ass
6fc0: 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61  ert( pTriggerSta
6fd0: 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20  ck->pTab );.    
6fe0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67      pTab = pTrig
6ff0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a  gerStack->pTab;.
7000: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7010: 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20  f( pTab ){ .    
7020: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
7030: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
7040: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20  = pTab->aCol;.. 
7050: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
7060: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
7070: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
7080: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7090: 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c  ; j < pTab->nCol
70a0: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b  ; j++, pCol++) {
70b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
70c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
70d0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
70e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
70f0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
7100: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
7110: 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e  lumn = j==pTab->
7120: 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a  iPKey ? -1 : j;.
7130: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7140: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
7150: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69  ab->aCol[j].affi
7160: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nity;.          
7170: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
7180: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70   pTab->aCol[j].p
7190: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
71a0: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
71b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
71c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
71d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
71e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
71f0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
7200: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
7210: 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a  GER) */..    /*.
7220: 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74      ** Perhaps t
7230: 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66  he name is a ref
7240: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f  erence to the RO
7250: 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  WID.    */.    i
7260: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74  f( cnt==0 && cnt
7270: 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  Tab==1 && sqlite
7280: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29  3IsRowid(zCol) )
7290: 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b  {.      cnt = 1;
72a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
72b0: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
72c0: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
72d0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
72e0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20  NTEGER;.    }.. 
72f0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
7300: 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20  the input is of 
7310: 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20  the form Z (not 
7320: 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68  Y.Z or X.Y.Z) th
7330: 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20  en the name Z.  
7340: 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72    ** might refer
7350: 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65   to an result-se
7360: 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68  t alias.  This h
7370: 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
7380: 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  ple, when.    **
7390: 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e   we are resolvin
73a0: 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57  g names in the W
73b0: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
73c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
73d0: 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mand:.    **.   
73e0: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
73f0: 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62  +b AS x FROM tab
7400: 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20  le WHERE x<10;. 
7410: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
7420: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c  cases like this,
7430: 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77   replace pExpr w
7440: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
7450: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
7460: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74  t.    ** forms t
7470: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e  he result set en
7480: 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68  try ("a+b" in th
7490: 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72  e example) and r
74a0: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
74b0: 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  y..    ** Note t
74c0: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
74d0: 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
74e0: 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65   set should have
74f0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
7500: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79    ** resolved by
7510: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48   the time the WH
7520: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65  ERE clause is re
7530: 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  solved..    */. 
7540: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
7550: 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 7a 54   pEList!=0 && zT
7560: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ab==0 ){.      f
7570: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
7580: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
7590: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73         char *zAs
75a0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
75b0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
75c0: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
75d0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
75e0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
75f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7600: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
7610: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
7620: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
7630: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
7640: 53 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  S;.          pEx
7650: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b  pr->iColumn = j;
7660: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
7670: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
7680: 33 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d  3ExprDup(pEList-
7690: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
76a0: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b          cnt = 1;
76b0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
76c0: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
76d0: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
76e0: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
76f0: 65 5f 65 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20  e_end_2;.       
7700: 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
7710: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  }..    /* Advanc
7720: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61  e to the next na
7730: 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65  me context.  The
7740: 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20   loop will exit 
7750: 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20  when either.    
7760: 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74  ** we have a mat
7770: 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68  ch (cnt>0) or wh
7780: 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  en we run out of
7790: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a   name contexts..
77a0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
77b0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  nt==0 ){.      p
77c0: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
77d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
77e0: 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59  .  ** If X and Y
77f0: 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74   are NULL (in ot
7800: 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c  her words if onl
7810: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
7820: 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70  e Z is.  ** supp
7830: 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61  lied) and the va
7840: 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c  lue of Z is encl
7850: 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71  osed in double-q
7860: 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a  uotes, then.  **
7870: 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c   Z is a string l
7880: 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65  iteral if it doe
7890: 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63  sn't match any c
78a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e  olumn names.  In
78b0: 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c   that.  ** case,
78c0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75   we need to retu
78d0: 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e  rn right away an
78e0: 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63  d not make any c
78f0: 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70  hanges to.  ** p
7900: 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Expr..  **.  ** 
7910: 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72  Because no refer
7920: 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f  ence was made to
7930: 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c   outer contexts,
7940: 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20   the pNC->nRef. 
7950: 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e   ** fields are n
7960: 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e  ot changed in an
7970: 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  y context..  */.
7980: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
7990: 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75  zTab==0 && pColu
79a0: 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27  mnToken->z[0]=='
79b0: 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  "' ){.    sqlite
79c0: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  Free(zCol);.    
79d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
79e0: 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20   /*.  ** cnt==0 
79f0: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20  means there was 
7a00: 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e  not match.  cnt>
7a10: 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65  1 means there we
7a20: 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d  re two or.  ** m
7a30: 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69  ore matches.  Ei
7a40: 74 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76  ther way, we hav
7a50: 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f  e an error..  */
7a60: 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b  .  if( cnt!=1 ){
7a70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30  .    char *z = 0
7a80: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
7a90: 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74  ;.    zErr = cnt
7aa0: 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63  ==0 ? "no such c
7ab0: 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d  olumn: %s" : "am
7ac0: 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e  biguous column n
7ad0: 61 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66  ame: %s";.    if
7ae0: 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ( zDb ){.      s
7af0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
7b00: 26 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54  &z, zDb, ".", zT
7b10: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
7b20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
7b30: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73   zTab ){.      s
7b40: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
7b50: 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  &z, zTab, ".", z
7b60: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Col, 0);.    }el
7b70: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  se{.      z = sq
7b80: 6c 69 74 65 53 74 72 44 75 70 28 7a 43 6f 6c 29  liteStrDup(zCol)
7b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7ba0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7bb0: 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20  se, zErr, z);.  
7bc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
7bd0: 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72  .    pTopNC->nEr
7be0: 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  r++;.  }..  /* I
7bf0: 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  f a column from 
7c00: 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c  a table in pSrcL
7c10: 69 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65  ist is reference
7c20: 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20  d, then record. 
7c30: 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e   ** this fact in
7c40: 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b   the pSrcList.a[
7c50: 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73  ].colUsed bitmas
7c60: 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75  k.  Column 0 cau
7c70: 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74  ses.  ** bit 0 t
7c80: 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d  o be set.  Colum
7c90: 6e 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20  n 1 sets bit 1. 
7ca0: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
7cb0: 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75  If the.  ** colu
7cc0: 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  mn number is gre
7cd0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75  ater than the nu
7ce0: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
7cf0: 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
7d00: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69   then set the hi
7d10: 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20  gh-order bit of 
7d20: 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a  the bitmask..  *
7d30: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69  /.  if( pExpr->i
7d40: 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61  Column>=0 && pMa
7d50: 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  tch!=0 ){.    in
7d60: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  t n = pExpr->iCo
7d70: 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e  lumn;.    if( n>
7d80: 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  =sizeof(Bitmask)
7d90: 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  *8 ){.      n = 
7da0: 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a  sizeof(Bitmask)*
7db0: 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  8-1;.    }.    a
7dc0: 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69  ssert( pMatch->i
7dd0: 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69  Cursor==pExpr->i
7de0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61  Table );.    pMa
7df0: 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20  tch->colUsed |= 
7e00: 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75  1<<n;.  }..looku
7e10: 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20  pname_end:.  /* 
7e20: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
7e30: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
7e40: 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71  eFree(zDb);.  sq
7e50: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
7e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
7e70: 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ete(pExpr->pLeft
7e80: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  );.  pExpr->pLef
7e90: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
7ea0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
7eb0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
7ec0: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a  pr->pRight = 0;.
7ed0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
7ee0: 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e  _COLUMN;.lookupn
7ef0: 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c  ame_end_2:.  sql
7f00: 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20  iteFree(zCol);. 
7f10: 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20   if( cnt==1 ){. 
7f20: 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d     assert( pNC!=
7f30: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
7f40: 41 75 74 68 52 65 61 64 28 70 50 61 72 73 65 2c  AuthRead(pParse,
7f50: 20 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72   pExpr, pNC->pSr
7f60: 63 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  cList);.    if( 
7f70: 70 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63  pMatch && !pMatc
7f80: 68 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  h->pSelect ){.  
7f90: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
7fa0: 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a  = pMatch->pTab;.
7fb0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63      }.    /* Inc
7fc0: 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20  rement the nRef 
7fd0: 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d  value on all nam
7fe0: 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20  e contexts from 
7ff0: 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20  TopNC up to.    
8000: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65  ** the point whe
8010: 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63  re the name matc
8020: 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hed. */.    for(
8030: 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ;;){.      asser
8040: 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a  t( pTopNC!=0 );.
8050: 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52        pTopNC->nR
8060: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ef++;.      if( 
8070: 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72  pTopNC==pNC ) br
8080: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  eak;.      pTopN
8090: 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78  C = pTopNC->pNex
80a0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
80b0: 75 72 6e 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 0;.  } else 
80c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
80d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
80e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
80f0: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
8100: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
8110: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  ee()..**.** Reso
8120: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
8130: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
8140: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
8150: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
8160: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
8170: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
8180: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
8190: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
81a0: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
81b0: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
81c0: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
81d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
81e0: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
81f0: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
8200: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
8210: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
8220: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
8230: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
8240: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
8250: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
8260: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
8270: 74 69 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f  tic int nameReso
8280: 6c 76 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70  lverStep(void *p
8290: 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72  Arg, Expr *pExpr
82a0: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
82b0: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
82c0: 74 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 53 72  text*)pArg;.  Sr
82d0: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 3b  cList *pSrcList;
82e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
82f0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
8300: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
8310: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
8320: 3b 0a 20 20 70 53 72 63 4c 69 73 74 20 3d 20 70  ;.  pSrcList = p
8330: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
8340: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
8350: 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 45 78 70  arse;..  if( Exp
8360: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
8370: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
8380: 65 64 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ed) ) return 1;.
8390: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
83a0: 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f  y(pExpr, EP_Reso
83b0: 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e  lved);.#ifndef N
83c0: 44 45 42 55 47 0a 20 20 69 66 28 20 70 53 72 63  DEBUG.  if( pSrc
83d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  List ){.    int 
83e0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
83f0: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
8400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
8410: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
8420: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
8430: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
8440: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
8450: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
8460: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
8470: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8480: 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71  .    /* Double-q
8490: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65  uoted strings (e
84a0: 78 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73  x: "abc") are us
84b0: 65 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72  ed as identifier
84c0: 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73  s if.    ** poss
84d0: 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  ible.  Otherwise
84e0: 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20   they remain as 
84f0: 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65  strings.  Single
8500: 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73  -quoted.    ** s
8510: 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63  trings (ex: 'abc
8520: 27 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74  ') are always st
8530: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20  ring literals.. 
8540: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
8550: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
8560: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
8570: 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20  en.z[0]=='\'' ) 
8580: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20  break;.      /* 
8590: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
85a0: 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66  he TK_ID case if
85b0: 20 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c   this is a doubl
85c0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
85d0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  */.    }.    /* 
85e0: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
85f0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
8600: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
8610: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
8620: 3a 20 7b 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70  : {.      lookup
8630: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
8640: 30 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  0, &pExpr->token
8650: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
8660: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
8670: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
8680: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
8690: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
86a0: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
86b0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
86c0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
86d0: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
86e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
86f0: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
8700: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
8710: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
8720: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
8730: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
8740: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
8750: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
8760: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
8770: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
8780: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
8790: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
87a0: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
87b0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
87c0: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
87d0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
87e0: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
87f0: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
8800: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
8820: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
8830: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
8840: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
8850: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8860: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
8870: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
8880: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
8890: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
88a0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
88b0: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
88c0: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
88d0: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
88e0: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
88f0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8900: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
8910: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
8920: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
8930: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
8940: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
8950: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
8960: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8970: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20  = pExpr->pList; 
8980: 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65     /* The argume
8990: 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  nt list */.     
89a0: 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f   int n = pList ?
89b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
89c0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
89d0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
89e0: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
89f0: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
8a00: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
8a10: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
8a20: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
8a30: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
8a40: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
8a50: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
8a60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8a70: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
8a80: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8a90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
8aa0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
8ab0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
8ac0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
8ad0: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
8ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8af0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
8b00: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
8b10: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
8b20: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
8b30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
8b40: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
8b50: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
8b60: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
8b70: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
8b80: 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69  about the functi
8b90: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
8ba0: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
8bb0: 2d 3e 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64  ->enc;  /* The d
8bc0: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
8bd0: 20 2a 2f 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d   */..      zId =
8be0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b   pExpr->token.z;
8bf0: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78  .      nId = pEx
8c00: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
8c10: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
8c20: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
8c30: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
8c40: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
8c50: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
8c60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
8c70: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
8c80: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
8c90: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
8ca0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
8cb0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
8cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
8cd0: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
8ce0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8cf0: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
8d00: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
8d10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8d20: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
8d30: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
8d40: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
8d50: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
8d60: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
8d70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8d80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8d90: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
8da0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
8db0: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
8dc0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
8dd0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
8de0: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
8df0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
8e00: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
8e10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8e20: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
8e30: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
8e40: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
8e50: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
8e60: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
8e70: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
8e80: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
8e90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8ea0: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
8eb0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8ec0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
8ed0: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
8ee0: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
8ef0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
8f00: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
8f10: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
8f20: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
8f30: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
8f40: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
8f50: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
8f60: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
8f70: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
8f80: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
8f90: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
8fa0: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
8fb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
8fc0: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
8fd0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
8fe0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
8ff0: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
9000: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
9010: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
9020: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
9030: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
9040: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
9050: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
9060: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
9070: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
9080: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
9090: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
90a0: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
90b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
90c0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
90d0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
90e0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
90f0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
9100: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
9110: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
9120: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
9130: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
9140: 52 65 66 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Ref;.        sql
9150: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
9160: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9170: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
9180: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9190: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
91a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
91b0: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
91c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
91d0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
91e0: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
91f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9200: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9210: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9220: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9230: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
9240: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
9250: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
9260: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
9270: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
9280: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
9290: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
92a0: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
92b0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
92c0: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
92d0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
92e0: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
92f0: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
9300: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
9310: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
9320: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
9330: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
9340: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
9350: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
9360: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
9370: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
9380: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
9390: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
93a0: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
93b0: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
93c0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
93d0: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
93e0: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
93f0: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
9400: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
9410: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
9420: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
9430: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
9440: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
9450: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
9460: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
9470: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
9480: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
9490: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
94a0: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
94b0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
94c0: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
94d0: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
94e0: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
94f0: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
9500: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
9510: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
9520: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
9530: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
9540: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
9550: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
9560: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
9570: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
9580: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
9590: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
95a0: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
95b0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
95c0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
95d0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
95e0: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
95f0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
9600: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9610: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
9620: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
9630: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
9640: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
9650: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
9660: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
9670: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
9680: 6c 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65  lveNames(.  Name
9690: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
96a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
96b0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
96c0: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
96d0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
96e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
96f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
9700: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
9710: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
9720: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 61  ) return 0;.  wa
9730: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
9740: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
9750: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28 20  ep, pNC);.  if( 
9760: 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  pNC->nErr>0 ){. 
9770: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9780: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
9790: 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  or);.  }.  retur
97a0: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
97b0: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
97c0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  r);.}../*.** A p
97d0: 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20  ointer instance 
97e0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
97f0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73  e is used to pas
9800: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
9810: 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70   through walkExp
9820: 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53  rTree into codeS
9830: 75 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a  ubqueryStep()..*
9840: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
9850: 20 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72   QueryCoder Quer
9860: 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51  yCoder;.struct Q
9870: 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61  ueryCoder {.  Pa
9880: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
9890: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
98a0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e  g context */.  N
98b0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b  ameContext *pNC;
98c0: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
98d0: 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73   of first enclos
98e0: 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a  ing query */.};.
98f0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9900: 20 63 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65   code for subque
9910: 72 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72  ries and IN oper
9920: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20  ators..**.** IN 
9930: 6f 70 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20  operators comes 
9940: 69 6e 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  in two forms:.**
9950: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
9960: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
9970: 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  .** and.**      
9980: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
9990: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
99a0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
99b0: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65  s handled by cre
99c0: 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64  ating a set hold
99d0: 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20  ing the list.** 
99e0: 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  of allowed value
99f0: 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  s.  The second f
9a00: 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53  orm causes the S
9a10: 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74  ELECT to generat
9a20: 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  e .** a temporar
9a30: 79 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  y table..*/.#ifn
9a40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9a50: 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71  SUBQUERY.void sq
9a60: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
9a70: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
9a80: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9a90: 20 20 69 6e 74 20 74 65 73 74 41 64 64 72 20 3d    int testAddr =
9aa0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
9ac0: 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65  -time test addre
9ad0: 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ss */.  Vdbe *v 
9ae0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
9af0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
9b00: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
9b10: 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d    /* This code m
9b20: 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74  ust be run in it
9b30: 73 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79  s entirety every
9b40: 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
9b50: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20  untered.  ** if 
9b60: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
9b70: 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20  wing is true:.  
9b80: 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  **.  **    *  Th
9b90: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
9ba0: 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65  e is a correlate
9bb0: 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d subquery.  ** 
9bc0: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
9bd0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20  hand side is an 
9be0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
9bf0: 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61  containing varia
9c00: 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20  bles.  **    *  
9c10: 57 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20  We are inside a 
9c20: 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a  trigger.  **.  *
9c30: 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
9c40: 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c  above are false,
9c50: 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e   then we can run
9c60: 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20   this code just 
9c70: 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74  once.  ** save t
9c80: 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20  he results, and 
9c90: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  reuse the same r
9ca0: 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75  esult on subsequ
9cb0: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e  ent invocations.
9cc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70  .  */.  if( !Exp
9cd0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
9ce0: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
9cf0: 65 63 74 29 20 26 26 20 21 70 50 61 72 73 65 2d  ect) && !pParse-
9d00: 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20  >trigStack ){.  
9d10: 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70 50 61 72    int mem = pPar
9d20: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
9d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9d40: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
9d50: 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  mem, 0);.    tes
9d60: 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
9d70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9d80: 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73  f, 0, 0);.    as
9d90: 73 65 72 74 28 20 74 65 73 74 41 64 64 72 3e 30  sert( testAddr>0
9da0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9dc0: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20  nteger, 1, 0);. 
9dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9de0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
9df0: 72 65 2c 20 6d 65 6d 2c 20 31 29 3b 0a 20 20 7d  re, mem, 1);.  }
9e00: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70  ..  if( pExpr->p
9e10: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
9e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9e30: 2c 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74 50  , OP_AggContextP
9e40: 75 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ush, 0, 0);.  }.
9e50: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9e60: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
9e70: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
9e80: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
9e90: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
9ea0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
9eb0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
9ec0: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
9ed0: 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75  enVirtual instru
9ee0: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
9ef0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9f00: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
9f10: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
9f20: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
9f30: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
9f40: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
9f50: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
9f60: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
9f70: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
9f80: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
9f90: 20 77 61 79 2e 20 41 20 76 69 72 74 75 61 6c 20   way. A virtual 
9fa0: 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20  table is .      
9fb0: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73  ** filled with s
9fc0: 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65  ingle-field inde
9fd0: 78 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74  x keys represent
9fe0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ing the results.
9ff0: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
a000: 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20  e SELECT or the 
a010: 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20  <exprlist>..    
a020: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
a030: 20 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73   the 'x' express
a040: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
a050: 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45  value, or the SE
a060: 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  LECT....      **
a070: 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
a080: 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ns a column valu
a090: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69  e, then the affi
a0a0: 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20  nity of that.   
a0b0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20     ** column is 
a0c0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68  used to build th
a0d0: 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  e index keys. If
a0e0: 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68   both 'x' and th
a0f0: 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43  e.      ** SELEC
a100: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
a110: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
a120: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a130: 79 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20  y is used.      
a140: 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c  ** if either col
a150: 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20  umn has NUMERIC 
a160: 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e  or INTEGER affin
a170: 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a  ity. If neither.
a180: 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72        ** 'x' nor
a190: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73   the SELECT... s
a1a0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
a1b0: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
a1c0: 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  ic affinity.    
a1d0: 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20    ** is used..  
a1e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
a1f0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
a200: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a210: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a220: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a230: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 45  _OpenVirtual, pE
a240: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
a250: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
a260: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
a270: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
a280: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
a290: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
a2a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a2b0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
a2c0: 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
a2d0: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
a2e0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
a2f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
a300: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
a310: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
a320: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
a330: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
a340: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
a350: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
a360: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
a370: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
a380: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
a390: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
a3a0: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
a3b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61  .        int iPa
a3c0: 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  rm = pExpr->iTab
a3d0: 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66  le +  (((int)aff
a3e0: 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20  inity)<<16);.   
a3f0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
a400: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
a410: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
a420: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
a430: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
a440: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
a450: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
a460: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
a470: 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d  , SRT_Set, iParm
a480: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
a490: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
a4a0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
a4b0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
a4c0: 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
a4d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b  List->nExpr>0 ){
a4e0: 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49   .          keyI
a4f0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62  nfo.aColl[0] = b
a500: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
a510: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
a520: 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20  r->pLeft,.      
a530: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
a540: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
a550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
a560: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
a570: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
a580: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
a590: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
a5a0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20  .        **..** 
a5b0: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
a5c0: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
a5d0: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
a5e0: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
a5f0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
a600: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
a610: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
a620: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
a630: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
a640: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
a650: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
a660: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
a670: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
a680: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
a690: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
a6a0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
a6b0: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
a6c0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a6d0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
a6e0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
a6f0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
a700: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a710: 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 20 20 20  m *pItem;..     
a720: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
a730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
a740: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
a750: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
a760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6b       }.        k
a770: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
a780: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
a790: 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20  pColl;..        
a7a0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
a7b0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
a7c0: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
a7d0: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
a7e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
a7f0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
a800: 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
a810: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
a820: 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
a830: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
a840: 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
a850: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
a860: 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
a870: 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
a880: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
a890: 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
a8a0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
a8b0: 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
a8c0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
a8d0: 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
a8e0: 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
a8f0: 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
a900: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
a910: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
a920: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
a930: 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
a940: 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
a950: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
a960: 28 20 74 65 73 74 41 64 64 72 3e 3d 30 20 26 26  ( testAddr>=0 &&
a970: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
a980: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
a990: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
a9a0: 4f 70 20 2a 61 4f 70 20 3d 20 73 71 6c 69 74 65  Op *aOp = sqlite
a9b0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 74 65  3VdbeGetOp(v, te
a9c0: 73 74 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20  stAddr-1);.     
a9d0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
a9e0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
a9f0: 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<4; i++){.  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 61 4f 70 5b              aOp[
aa10: 69 5d 2e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  i].opcode = OP_N
aa20: 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20  oop;.           
aa30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
aa40: 65 73 74 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  estAddr = 0;.   
aa50: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
aa60: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
aa70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
aa80: 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
aa90: 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
aaa0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
aab0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
aac0: 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20  arse, pE2);.    
aad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aae0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
aaf0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
ab00: 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
ab10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ab20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
ab30: 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
ab40: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
ab50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ab60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ab70: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
ab80: 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f  (void *)&keyInfo
ab90: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
aba0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
abb0: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  }..    case TK_E
abc0: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
abd0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
abe0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74     /* This has t
abf0: 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45  o be a scalar SE
ac00: 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
ac10: 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a  code to put the.
ac20: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
ac30: 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e  f this select in
ac40: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61   a memory cell a
ac50: 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  nd record the nu
ac60: 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
ac70: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
ac80: 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20   in iColumn..   
ac90: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
aca0: 73 6f 70 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sop;.      Selec
acb0: 74 20 2a 70 53 65 6c 3b 0a 0a 20 20 20 20 20 20  t *pSel;..      
acc0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
acd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
ace0: 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
acf0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
ad00: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
ad10: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
ad20: 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53 52          sop = SR
ad30: 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  T_Mem;.      }el
ad40: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61 74  se{.        stat
ad50: 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 6f  ic const Token o
ad60: 6e 65 20 3d 20 7b 20 22 31 22 2c 20 30 2c 20 31  ne = { "1", 0, 1
ad70: 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 6f 70 20   };.        sop 
ad80: 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
ad90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ada0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65 6c  rListDelete(pSel
adb0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
adc0: 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20     pSel->pEList 
add0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ade0: 74 41 70 70 65 6e 64 28 30 2c 20 0a 20 20 20 20  tAppend(0, .    
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ae10: 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  r(TK_INTEGER, 0,
ae20: 20 30 2c 20 26 6f 6e 65 29 2c 20 30 29 3b 0a 20   0, &one), 0);. 
ae30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ae40: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
ae50: 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 70 45  e, pSel, sop, pE
ae60: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c  xpr->iColumn, 0,
ae70: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
ae80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ae90: 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  }..  if( pExpr->
aea0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
aeb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
aec0: 76 2c 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78 74  v, OP_AggContext
aed0: 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  Pop, 0, 0);.  }.
aee0: 20 20 69 66 28 20 74 65 73 74 41 64 64 72 20 29    if( testAddr )
aef0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
af00: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 74 65 73  eChangeP2(v, tes
af10: 74 41 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64  tAddr, sqlite3Vd
af20: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
af30: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
af40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
af50: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
af60: 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  Y */../*.** Gene
af70: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
af80: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
af90: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
afa0: 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
afb0: 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74  t z[0..n-1] on t
afc0: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61  he stack..*/.sta
afd0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
afe0: 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f  eger(Vdbe *v, co
aff0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
b000: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   n){.  int i;.  
b010: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
b020: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
b030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b040: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
b050: 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , i, 0);.  }else
b060: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73   if( sqlite3Fits
b070: 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20  In64Bits(z) ){. 
b080: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
b090: 33 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  3(v, OP_Int64, 0
b0a0: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65  , 0, z, n);.  }e
b0b0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
b0c0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65  VdbeOp3(v, OP_Re
b0d0: 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  al, 0, 0, z, n);
b0e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
b0f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
b100: 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
b110: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
b120: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
b130: 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20  ssion and leave 
b140: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68  the result on th
b150: 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a  e top of stack..
b160: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
b170: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
b180: 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
b190: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
b1a0: 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
b1b0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
b1c0: 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
b1d0: 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
b1e0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
b1f0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
b200: 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
b210: 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
b220: 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
b230: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
b240: 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
b250: 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
b260: 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
b270: 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
b280: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
b290: 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
b2a0: 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
b2b0: 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
b2c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b2d0: 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
b2e0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
b2f0: 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
b300: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
b310: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66  ;.  int op;.  if
b320: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
b330: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
b340: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
b350: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
b360: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  ll, 0, 0);.    r
b370: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 70 20  eturn;.  }.  op 
b380: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
b390: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
b3a0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
b3b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
b3c0: 61 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20 26 26  arse->fillAgg &&
b3d0: 20 70 45 78 70 72 2d 3e 69 41 67 67 3e 3d 30 20   pExpr->iAgg>=0 
b3e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b3f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b400: 50 5f 41 67 67 47 65 74 2c 20 70 45 78 70 72 2d  P_AggGet, pExpr-
b410: 3e 69 41 67 67 43 74 78 2c 20 70 45 78 70 72 2d  >iAggCtx, pExpr-
b420: 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65  >iAgg);.      }e
b430: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
b440: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
b450: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b460: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
b470: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
b480: 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
b490: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
b4a0: 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
b4b0: 28 76 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  (v, pExpr->pTab,
b4c0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
b4d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b4e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b4f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
b500: 77 69 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  wid, pExpr->iTab
b510: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  le, 0);.      }.
b520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b530: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
b540: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
b550: 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70  codeInteger(v, p
b560: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
b570: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
b580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b590: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
b5a0: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
b5b0: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
b5c0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f    assert( TK_FLO
b5d0: 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20  AT==OP_Real );. 
b5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b5f0: 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e  STRING==OP_Strin
b600: 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g8 );.      sqli
b610: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70  te3VdbeOp3(v, op
b620: 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74  , 0, 0, pExpr->t
b630: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
b640: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73  oken.n);.      s
b650: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
b660: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
b670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b680: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
b690: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b6a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b6b0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
b6c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b6d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6e0: 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
b6f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
b700: 42 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  B: {.      asser
b710: 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48  t( TK_BLOB==OP_H
b720: 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  exBlob );.      
b730: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
b740: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78 70  , op, 0, 0, pExp
b750: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70 45  r->token.z+1, pE
b760: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29 3b  xpr->token.n-1);
b770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b780: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
b790: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
b7a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b7b0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
b7c0: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
b7d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b7e0: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
b7f0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
b800: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
b810: 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20  >token.n>1 ){.  
b820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b830: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
b840: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
b850: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
b860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b870: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b880: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
b890: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
b8a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b8b0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
b8c0: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
b8d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b8e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b8f0: 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
b900: 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
b910: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
b920: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
b930: 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
b940: 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
b950: 69 6e 74 20 61 66 66 2c 20 6f 70 3b 0a 20 20 20  int aff, op;.   
b960: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b970: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b980: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b990: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41 66 66  aff = sqlite3Aff
b9a0: 69 6e 69 74 79 54 79 70 65 28 26 70 45 78 70 72  inityType(&pExpr
b9b0: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
b9c0: 73 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20  switch( aff ){. 
b9d0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
b9e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20  TE_AFF_INTEGER: 
b9f0: 20 20 6f 70 20 3d 20 4f 50 5f 54 6f 49 6e 74 3b    op = OP_ToInt;
ba00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba10: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ba20: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 20 20  _AFF_NUMERIC:   
ba30: 6f 70 20 3d 20 4f 50 5f 54 6f 4e 75 6d 65 72 69  op = OP_ToNumeri
ba40: 63 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c;  break;.     
ba50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
ba60: 46 46 5f 54 45 58 54 3a 20 20 20 20 20 20 6f 70  FF_TEXT:      op
ba70: 20 3d 20 4f 50 5f 54 6f 54 65 78 74 3b 20 20 20   = OP_ToText;   
ba80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ba90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
baa0: 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 6f 70 20 3d  _NONE:      op =
bab0: 20 4f 50 5f 54 6f 42 6c 6f 62 3b 20 20 20 20 20   OP_ToBlob;     
bac0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
bad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bae0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
baf0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
bb00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
bb10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
bb20: 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  T */.    case TK
bb30: 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
bb40: 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
bb50: 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
bb60: 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
bb70: 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
bb80: 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  _EQ: {.      ass
bb90: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  ert( TK_LT==OP_L
bba0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
bbb0: 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20  t( TK_LE==OP_Le 
bbc0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bbd0: 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b   TK_GT==OP_Gt );
bbe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bbf0: 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  K_GE==OP_Ge );. 
bc00: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
bc10: 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  EQ==OP_Eq );.   
bc20: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45     assert( TK_NE
bc30: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
bc40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
bc50: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
bc60: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
bc70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
bc80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
bc90: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
bca0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
bcb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
bcc0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
bcd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
bce0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bcf0: 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
bd00: 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
bd10: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
bd20: 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
bd30: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
bd40: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
bd50: 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
bd60: 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
bd70: 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
bd80: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
bd90: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
bda0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
bdb0: 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
bdc0: 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
bdd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
bde0: 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20  D==OP_And );.   
bdf0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52     assert( TK_OR
be00: 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20  ==OP_Or );.     
be10: 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
be20: 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20 20  ==OP_Add );.    
be30: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
be40: 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
be50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
be60: 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
be70: 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20 61  inder );.      a
be80: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44  ssert( TK_BITAND
be90: 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20  ==OP_BitAnd );. 
bea0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
beb0: 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20  BITOR==OP_BitOr 
bec0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bed0: 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
bee0: 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61 73  vide );.      as
bef0: 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
bf00: 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
bf10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bf20: 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_RSHIFT==OP_Shi
bf30: 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20  ftRight );.     
bf40: 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43   assert( TK_CONC
bf50: 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b  AT==OP_Concat );
bf60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bf70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
bf80: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
bf90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
bfa0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
bfb0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
bfc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bfd0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
bfe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bff0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c000: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
c010: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
c020: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
c030: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
c040: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
c050: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
c060: 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   || pLeft->op==T
c070: 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
c080: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20       Token *p = 
c090: 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pLeft->token;. 
c0a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
c0b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
c0c0: 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20  ->n + 2 );.     
c0d0: 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d     sprintf(z, "-
c0e0: 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e  %.*s", p->n, p->
c0f0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
c100: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
c110: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
c120: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c130: 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30  v, OP_Real, 0, 0
c140: 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20  , z, p->n+1);.  
c150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c160: 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
c170: 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  er(v, z, p->n+1)
c180: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c190: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
c1a0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
c1b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c1c0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
c1d0: 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20  into TK_NOT */. 
c1e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c1f0: 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73  _BITNOT:.    cas
c200: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
c210: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
c220: 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29  NOT==OP_BitNot )
c230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c240: 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29  TK_NOT==OP_Not )
c250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c260: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c270: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
c280: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c290: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
c2a0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
c2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c2c0: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
c2d0: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
c2e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  {.      int dest
c2f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c300: 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
c310: 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Null );.      as
c320: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
c330: 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
c340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
c360: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20  eger, 1, 0);.   
c370: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c380: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
c390: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c3a0: 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  dest = sqlite3Vd
c3b0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
c3c0: 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 2;.      sqli
c3d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c3e0: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
c3f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c400: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d  ddOp(v, OP_AddIm
c410: 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20  m, -1, 0);.     
c420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c430: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
c440: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
c450: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c460: 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30  (v, OP_AggGet, 0
c470: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a  , pExpr->iAgg);.
c480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c490: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
c4a0: 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
c4b0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
c4c0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
c4d0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
c4e0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  ->pList;.      i
c4f0: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  nt nExpr = pList
c500: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
c510: 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44  : 0;.      FuncD
c520: 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20  ef *pDef;.      
c530: 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63  int nId;.      c
c540: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a  onst char *zId;.
c550: 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 30        int p2 = 0
c560: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
c570: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50       u8 enc = pP
c580: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
c590: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
c5a0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  oll = 0;.      z
c5b0: 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
c5c0: 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  n.z;.      nId =
c5d0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b   pExpr->token.n;
c5e0: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
c5f0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
c600: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
c610: 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65  d, nId, nExpr, e
c620: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  nc, 0);.      as
c630: 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b  sert( pDef!=0 );
c640: 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73  .      nExpr = s
c650: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
c660: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
c670: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  List);.      for
c680: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26  (i=0; i<nExpr &&
c690: 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<32; i++){.   
c6a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
c6b0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
c6c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c6d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
c6e0: 32 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20  2 |= (1<<i);.   
c6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
c700: 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
c710: 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c 20 29  lSeq && !pColl )
c720: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
c730: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
c740: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c750: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c760: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c770: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
c780: 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71  Def->needCollSeq
c790: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c7a0: 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
c7b0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
c7c0: 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20  ltColl; .       
c7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c7e0: 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
c7f0: 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
c800: 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P3_COLLSEQ);
c810: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c820: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
c830: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45   OP_Function, nE
c840: 78 70 72 2c 20 70 32 2c 20 28 63 68 61 72 2a 29  xpr, p2, (char*)
c850: 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44 45 46  pDef, P3_FUNCDEF
c860: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c870: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
c880: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
c890: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  RY.    case TK_E
c8a0: 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
c8b0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
c8c0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
c8d0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
c8e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
c8f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c900: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45  , OP_MemLoad, pE
c910: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29  xpr->iColumn, 0)
c920: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c930: 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20  ent((v, "# load 
c940: 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
c950: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
c960: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c970: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
c980: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63  nt addr;.      c
c990: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
c9a0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
c9b0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
c9c0: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
c9d0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
c9e0: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
c9f0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
ca00: 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
ca10: 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ts.      ** of t
ca20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61  he expression. a
ca30: 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65  ffinityStr store
ca40: 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
ca50: 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20  g suitable for. 
ca60: 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50       ** P3 of OP
ca70: 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20  _MakeRecord..   
ca80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 69     */.      affi
ca90: 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
caa0: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
cab0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
cac0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cad0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a  Integer, 1, 0);.
cae0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
caf0: 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
cb00: 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
cb10: 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  . The temporary 
cb20: 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70  table.      ** p
cb30: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e  Expr->iTable con
cb40: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
cb50: 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
cb60: 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20  e (...) set..   
cb70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
cb80: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
cb90: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
cba0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
cbb0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
cbc0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
cbd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cbe0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
cbf0: 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20   -1, addr+4);   
cc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72           /* addr
cc10: 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71   + 0 */.      sq
cc20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cc30: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
cc40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cc50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
cc60: 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 0, 0);.     
cc70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cc80: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
cc90: 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20   addr+7);.      
cca0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
ccb0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ccc0: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
ccd0: 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20  , 1);   /* addr 
cce0: 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 4 */.      sql
ccf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cd00: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
cd10: 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37  ->iTable, addr+7
cd20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cd30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cd40: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20  AddImm, -1, 0); 
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a   /* addr + 6 */.
cd70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cd80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
cd90: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
cda0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
cdb0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
cdc0: 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  ft;.      struct
cdd0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
cde0: 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e  pLItem = pExpr->
cdf0: 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  pList->a;.      
ce00: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
ce10: 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  LItem->pExpr;.  
ce20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
ce30: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ode(pParse, pLef
ce40: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ce50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ce60: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
ce70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ce80: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
ce90: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
cea0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
ceb0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
cec0: 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Ge, 0, 0);.     
ced0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cee0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
cef0: 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65   0);.      pLIte
cf00: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
cf10: 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
cf20: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
cf30: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
cf40: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
cf50: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
cf60: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
cf70: 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b  t, OP_Le, 0, 0);
cf80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cf90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e  beAddOp(v, OP_An
cfa0: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
cfb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cfc0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a   case TK_UPLUS:.
cfd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
cfe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
cff0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d000: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
d010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d020: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41  }.    case TK_CA
d030: 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE: {.      int 
d040: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a  expr_end_label;.
d050: 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e        int jumpIn
d060: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  st;.      int ad
d070: 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  dr;.      int nE
d080: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  xpr;.      int i
d090: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
d0a0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20   *pEList;.      
d0b0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d0c0: 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
d0d0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
d0e0: 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  Expr->pList);.  
d0f0: 20 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70      assert((pExp
d100: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
d110: 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20  % 2) == 0);.    
d120: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
d130: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30  pList->nExpr > 0
d140: 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20  );.      pEList 
d150: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
d160: 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20        aListelem 
d170: 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
d180: 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73     nExpr = pELis
d190: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
d1a0: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d  expr_end_label =
d1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d1c0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d1d0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
d1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d1f0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d200: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d210: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d220: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
d230: 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  r; i=i+2){.     
d240: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
d250: 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
d260: 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  elem[i].pExpr);.
d270: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
d280: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
d290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d2a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
d2b0: 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 1, 1);.       
d2c0: 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f     jumpInst = co
d2d0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
d2e0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
d2f0: 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
d300: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31       OP_Ne, 0, 1
d330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d340: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d350: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
d360: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d370: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
d380: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
d390: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  ddOp(v, OP_IfNot
d3a0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
d3b0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
d3c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d3d0: 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
d3e0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d3f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d400: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
d410: 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  , expr_end_label
d420: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
d430: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d440: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
d450: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d460: 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70  ChangeP2(v, jump
d470: 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20 20 20  Inst, addr);.   
d480: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
d490: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
d4a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d4b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
d4c0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
d4d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
d4e0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
d4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d500: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
d510: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
d520: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d540: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  Op(v, OP_Null, 0
d550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d570: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
d580: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a  xpr_end_label);.
d590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d5a0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
d5b0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
d5c0: 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
d5d0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
d5e0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
d5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d600: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d610: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
d620: 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
d630: 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
d640: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
d650: 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
d660: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ..return;.      
d670: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
d680: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49  r->iColumn!=OE_I
d690: 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
d6a0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
d6b0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c  >iColumn==OE_Rol
d6c0: 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20  lback ||.       
d6d0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
d6e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41  >iColumn == OE_A
d6f0: 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20  bort ||.        
d700: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
d710: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61  iColumn == OE_Fa
d720: 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  il );.         s
d730: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
d740: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
d750: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78  _CONSTRAINT, pEx
d760: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
d790: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
d7a0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 73  n.n);.         s
d7b0: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
d7c0: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
d7d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
d7e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
d7f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
d800: 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
d810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d820: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  ddOp(v, OP_Conte
d830: 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
d840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d850: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
d860: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
d870: 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
d880: 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
d890: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
d8a0: 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29  "# raise(IGNORE)
d8b0: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
d8c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72   }.#endif.    br
d8d0: 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  eak;.  }.}..#ifn
d8e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d8f0: 54 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65  TRIGGER./*.** Ge
d900: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
d910: 20 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69   evalutes the gi
d920: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ven expression a
d930: 6e 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65  nd leaves the re
d940: 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  sult.** on the s
d950: 74 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20  tack.  See also 
d960: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d970: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
d980: 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f  utine might also
d990: 20 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c   cache the resul
d9a0: 74 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  t and modify the
d9b0: 20 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73   pExpr tree.** s
d9c0: 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d  o that it will m
d9d0: 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63  ake use of the c
d9e0: 61 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20  ached result on 
d9f0: 73 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75  subsequent evalu
da00: 61 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72  ations.** rather
da10: 20 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74   than evaluate t
da20: 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73  he whole express
da30: 69 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76  ion again.  Triv
da40: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ial expressions 
da50: 61 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65  are.** not cache
da60: 64 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  d.  If the expre
da70: 73 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c  ssion is cached,
da80: 20 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73   its result is s
da90: 74 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d  tored in a .** m
daa0: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  emory location..
dab0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
dac0: 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
dad0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
dae0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56  xpr *pExpr){.  V
daf0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
db00: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d  >pVdbe;.  int iM
db10: 65 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  em;.  int addr1,
db20: 20 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d   addr2;.  if( v=
db30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
db40: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
db50: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
db60: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
db70: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
db80: 72 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71  r);.  addr2 = sq
db90: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
dba0: 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61  Addr(v);.  if( a
dbb0: 64 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20  ddr2>addr1+1 || 
dbc0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
dbd0: 28 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f  (v, addr1)->opco
dbe0: 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  de==OP_Function 
dbf0: 29 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45  ){.    iMem = pE
dc00: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50  xpr->iTable = pP
dc10: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
dc20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc30: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
dc40: 65 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  e, iMem, 0);.   
dc50: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
dc60: 52 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a  REGISTER;.  }.}.
dc70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
dc80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
dc90: 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75   pushes the valu
dca0: 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65  e of every eleme
dcb0: 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a  nt of the given.
dcc0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
dcd0: 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  st onto the stac
dce0: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
dcf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
dd00: 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e  ements pushed on
dd10: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f  to the stack..*/
dd20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
dd30: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
dd40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
dd50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
dd60: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
dd70: 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a  ist *pList    /*
dd80: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
dd90: 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64  list to be coded
dda0: 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
ddb0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
ddc0: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
ddd0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
dde0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
ddf0: 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20 73 71  turn 0;.  v = sq
de00: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
de10: 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73  rse);.  n = pLis
de20: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28  t->nExpr;.  for(
de30: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
de40: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
de50: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
de60: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
de70: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
de80: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
de90: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
dea0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
deb0: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
dec0: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
ded0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
dee0: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
def0: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
df00: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
df10: 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
df20: 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
df30: 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
df40: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
df50: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
df60: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
df70: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
df80: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
df90: 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
dfa0: 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
dfb0: 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
dfc0: 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
dfd0: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
dfe0: 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
dff0: 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
e000: 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
e010: 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
e020: 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
e030: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
e040: 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
e050: 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
e060: 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
e070: 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
e080: 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
e090: 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
e0a0: 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
e0b0: 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
e0c0: 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
e0d0: 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
e0e0: 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
e0f0: 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
e100: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
e110: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
e120: 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
e130: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
e140: 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
e150: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
e160: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
e170: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
e180: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
e190: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
e1a0: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
e1b0: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
e1c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d  ) return;.  op =
e1d0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
e1e0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
e1f0: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
e200: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
e210: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e220: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
e230: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
e240: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e250: 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49  Left, d2, !jumpI
e260: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
e270: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
e280: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e290: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
e2a0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
e2b0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e2c0: 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
e2d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e2e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
e2f0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
e300: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
e310: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e320: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
e330: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
e340: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
e350: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
e360: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
e370: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
e380: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e390: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
e3a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
e3b0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
e3c0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
e3d0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
e3e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e3f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
e400: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
e410: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
e420: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
e430: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
e440: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
e450: 51 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Q: {.      asser
e460: 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20  t( TK_LT==OP_Lt 
e470: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e480: 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b   TK_LE==OP_Le );
e490: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
e4a0: 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20  K_GT==OP_Gt );. 
e4b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e4c0: 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20  GE==OP_Ge );.   
e4d0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51     assert( TK_EQ
e4e0: 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
e4f0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d   assert( TK_NE==
e500: 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73  OP_Ne );.      s
e510: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e520: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e530: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
e540: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e550: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
e560: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
e570: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
e580: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
e590: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
e5a0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
e5b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e5c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e5d0: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
e5e0: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
e5f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e600: 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
e610: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ll );.      asse
e620: 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
e630: 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
e640: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e650: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e660: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
e670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e680: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
e690: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e6a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e6b0: 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
e6c0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
e6d0: 73 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20  sion "x BETWEEN 
e6e0: 79 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c  y AND z" is impl
e6f0: 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20  emented as:.    
e700: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20    **.      ** 1 
e710: 49 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20  IF (x < y) GOTO 
e720: 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20  3.      ** 2 IF 
e730: 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64  (x <= z) GOTO <d
e740: 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20  est>.      ** 3 
e750: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
e760: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
e770: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
e780: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
e790: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
e7a0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
e7b0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
e7c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e7d0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ode(pParse, pLef
e7e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e7f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e800: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
e810: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e820: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
e830: 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  t);.      addr =
e840: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
e850: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
e860: 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a  ht, OP_Lt, 0, !j
e870: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20  umpIfNull);..   
e880: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
e890: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
e8a0: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
e8b0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e8c0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
e8d0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
e8e0: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
e8f0: 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73  ight, OP_Le, des
e900: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
e910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e920: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
e930: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
e940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e950: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
e960: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e970: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
e980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e990: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
e9a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
e9b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
e9c0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
e9d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e9e0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
e9f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ea00: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a  ddOp(v, OP_If, j
ea10: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
ea20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ea30: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ea40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ea50: 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
ea60: 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
ea70: 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
ea80: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
ea90: 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
eaa0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
eab0: 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
eac0: 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
ead0: 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
eae0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
eaf0: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
eb00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
eb10: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
eb20: 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
eb30: 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
eb40: 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
eb50: 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72  fNull is true or
eb60: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
eb70: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66   jumpIfNull is f
eb80: 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  alse..*/.void sq
eb90: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
eba0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ebb0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
ebc0: 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
ebd0: 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
ebe0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ebf0: 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
ec00: 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
ec10: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
ec20: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
ec30: 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
ec40: 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
ec50: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
ec60: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
ec70: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
ec80: 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
ec90: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
eca0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
ecb0: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
ecc0: 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
ecd0: 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
ece0: 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
ecf0: 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
ed00: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
ed20: 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
ed30: 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
ed40: 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
ed50: 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
ed60: 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
ed70: 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
ed80: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
ed90: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
edb0: 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
edc0: 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
edd0: 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
ede0: 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
edf0: 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
ee00: 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
ee10: 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
ee20: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
ee30: 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
ee40: 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
ee50: 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
ee60: 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
ee70: 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
ee80: 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
ee90: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
eea0: 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
eeb0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
eec0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
eed0: 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
eee0: 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
eef0: 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
ef00: 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
ef10: 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
ef20: 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
ef30: 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
ef40: 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
ef50: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ef60: 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
ef70: 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
ef80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
ef90: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
efa0: 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
efb0: 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
efc0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
efd0: 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
efe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
eff0: 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
f000: 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
f010: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f020: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
f030: 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
f040: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
f050: 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
f060: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
f070: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
f080: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
f090: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
f0a0: 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
f0b0: 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
f0c0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
f0d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
f0e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f0f0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
f100: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f110: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
f120: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
f130: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
f140: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
f150: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
f160: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
f170: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f180: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
f190: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
f1a0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f1b0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
f1c0: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
f1d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
f1e0: 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e  ft, d2, !jumpIfN
f1f0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
f200: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
f210: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
f220: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
f230: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
f240: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f250: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
f260: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f270: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
f280: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
f290: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
f2a0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f2b0: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
f2c0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
f2d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f2e0: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
f2f0: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
f300: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
f310: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
f320: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
f330: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
f340: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f350: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
f360: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
f370: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f380: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
f390: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
f3a0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
f3b0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
f3c0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
f3d0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
f3e0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
f3f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f400: 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
f410: 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
f420: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f430: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
f440: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
f450: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f460: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
f470: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
f480: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f490: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
f4a0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
f4b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42  pression is "x B
f4c0: 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e  ETWEEN y AND z".
f4d0: 20 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74   It is implement
f4e0: 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
f4f0: 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78        ** 1 IF (x
f500: 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20   >= y) GOTO 3.  
f510: 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64      ** 2 GOTO <d
f520: 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20  est>.      ** 3 
f530: 49 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20  IF (x > z) GOTO 
f540: 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a  <dest>.      */.
f550: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
f560: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
f570: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
f580: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
f590: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
f5a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
f5b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f5c0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f5d0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
f5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f5f0: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
f600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f610: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
f620: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
f630: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
f640: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f650: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
f660: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
f670: 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61  pRight, OP_Ge, a
f680: 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75  ddr+3, !jumpIfNu
f690: 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  ll);..      sqli
f6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f6b0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
f6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f6d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
f6e0: 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
f6f0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
f700: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
f710: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
f720: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f730: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
f740: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
f750: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
f760: 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74  ght, OP_Gt, dest
f770: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
f780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f790: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
f7a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f7b0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f7c0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
f7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f7e0: 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49   OP_IfNot, jumpI
f7f0: 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20  fNull, dest);.  
f800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f810: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  .  }.}../*.** Do
f820: 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
f830: 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
f840: 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
f850: 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
f860: 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61  ro).** if they a
f870: 72 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64  re identical and
f880: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   return FALSE if
f890: 20 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20   they differ in 
f8a0: 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20  any way..*/.int 
f8b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
f8c0: 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70  re(Expr *pA, Exp
f8d0: 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b  r *pB){.  int i;
f8e0: 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a  .  if( pA==0 ){.
f8f0: 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30      return pB==0
f900: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
f910: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
f920: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
f930: 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20  A->op!=pB->op ) 
f940: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f950: 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
f960: 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
f970: 42 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  B->pLeft) ) retu
f980: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
f990: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
f9a0: 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
f9b0: 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
f9c0: 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c   0;.  if( pA->pL
f9d0: 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ist ){.    if( p
f9e0: 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  B->pList==0 ) re
f9f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
fa00: 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
fa10: 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  !=pB->pList->nEx
fa20: 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  pr ) return 0;. 
fa30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
fa40: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
fa50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
fa60: 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
fa70: 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61  are(pA->pList->a
fa80: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70  [i].pExpr, pB->p
fa90: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
faa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
fab0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
fac0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
fad0: 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pB->pList ){.  
fae0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
faf0: 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63    if( pA->pSelec
fb00: 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74  t || pB->pSelect
fb10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
fb20: 66 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70  f( pA->iTable!=p
fb30: 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d  B->iTable || pA-
fb40: 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43  >iColumn!=pB->iC
fb50: 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30  olumn ) return 0
fb60: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65  ;.  if( pA->toke
fb70: 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n.z ){.    if( p
fb80: 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20  B->token.z==0 ) 
fb90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
fba0: 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70  ( pB->token.n!=p
fbb0: 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74  A->token.n ) ret
fbc0: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73  urn 0;.    if( s
fbd0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
fbe0: 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e  A->token.z, pB->
fbf0: 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b  token.z, pB->tok
fc00: 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72  en.n)!=0 ) retur
fc10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
fc20: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
fc30: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
fc40: 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
fc50: 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  Agg[] array and 
fc60: 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78  return its index
fc70: 2e 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6c 65  ..** The new ele
fc80: 6d 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69  ment is initiali
fc90: 7a 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  zed to zero.  Th
fca0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
fcb0: 6f 6e 20 69 73 0a 2a 2a 20 65 78 70 65 63 74 65  on is.** expecte
fcc0: 64 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  d to fill it in.
fcd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
fce0: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72  ppendAggInfo(Par
fcf0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
fd00: 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67  f( (pParse->nAgg
fd10: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
fd20: 20 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72    int amt = pPar
fd30: 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20  se->nAgg + 8;.  
fd40: 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20    AggExpr *aAgg 
fd50: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
fd60: 70 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d  pParse->aAgg, am
fd70: 74 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  t*sizeof(pParse-
fd80: 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20  >aAgg[0]));.    
fd90: 69 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20  if( aAgg==0 ){. 
fda0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
fdb0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
fdc0: 2d 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20  ->aAgg = aAgg;. 
fdd0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61   }.  memset(&pPa
fde0: 72 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65  rse->aAgg[pParse
fdf0: 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65  ->nAgg], 0, size
fe00: 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  of(pParse->aAgg[
fe10: 30 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  0]));.  return p
fe20: 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d  Parse->nAgg++;.}
fe30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
fe40: 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c  an xFunc for wal
fe50: 6b 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64  kExprTree() used
fe60: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a   to implement .*
fe70: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  * sqlite3ExprAna
fe80: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
fe90: 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
fea0: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
feb0: 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
fec0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
fed0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
fee0: 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74  utine analyzes t
fef0: 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
ff00: 63 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a  ction at pExpr..
ff10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e  */.static int an
ff20: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76  alyzeAggregate(v
ff30: 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20  oid *pArg, Expr 
ff40: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69  *pExpr){.  int i
ff50: 3b 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67  ;.  AggExpr *aAg
ff60: 67 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  g;.  NameContext
ff70: 20 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e   *pNC = (NameCon
ff80: 74 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50  text *)pArg;.  P
ff90: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
ffa0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72  NC->pParse;.  Sr
ffb0: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
ffc0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
ffd0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
ffe0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
fff0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
10000 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 53       for(i=0; pS
10010 72 63 4c 69 73 74 20 26 26 20 69 3c 70 53 72 63  rcList && i<pSrc
10020 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
10030 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
10040 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
10050 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
10060 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
10070 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e   aAgg = pParse->
10080 61 41 67 67 3b 0a 20 20 20 20 20 20 20 20 20 20  aAgg;.          
10090 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
100a0 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
100b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
100c0 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
100d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
100e0 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d       if( aAgg[i]
100f0 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d  .pExpr->iTable==
10100 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
10110 20 20 20 20 20 20 20 20 20 20 20 26 26 20 61 41             && aA
10120 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  gg[i].pExpr->iCo
10130 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
10140 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
10150 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10160 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10180 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
10190 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nAgg ){.        
101a0 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
101b0 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
101c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
101d0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
101e0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
101f0 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
10200 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10210 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
10220 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
10230 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
10240 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
10250 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  gg = i;.        
10260 20 20 70 45 78 70 72 2d 3e 69 41 67 67 43 74 78    pExpr->iAggCtx
10270 20 3d 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3b 0a   = pNC->nDepth;.
10280 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10290 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
102a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
102b0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
102c0 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
102d0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  TION: {.      if
102e0 28 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30  ( pNC->nDepth==0
102f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 41 67 67   ){.        aAgg
10300 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
10310 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
10320 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
10330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
10340 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69    if( !aAgg[i].i
10350 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
10360 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
10370 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
10380 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c  e(aAgg[i].pExpr,
10390 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20   pExpr) ){.     
103a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
103b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
103c0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
103d0 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
103e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
103f0 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
10400 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  ->enc;.         
10410 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
10420 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
10430 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20        if( i<0 ) 
10440 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
10450 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
10460 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20  [i].isAgg = 1;. 
10470 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
10480 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
10490 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
104a0 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
104b0 5d 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ].pFunc = sqlite
104c0 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
104d0 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
104e0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
104f0 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
10500 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20  token.n,.       
10510 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
10520 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
10530 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
10540 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
10550 20 7d 0a 20 20 20 20 20 20 20 20 70 45 78 70 72   }.        pExpr
10560 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
10570 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10590 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
105a0 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d  lect ){.    pNC-
105b0 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77  >nDepth++;.    w
105c0 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45  alkSelectExpr(pE
105d0 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e  xpr->pSelect, an
105e0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
105f0 70 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e  pNC);.    pNC->n
10600 44 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72  Depth--;.  }.  r
10610 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
10620 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69  * Analyze the gi
10630 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ven expression l
10640 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65  ooking for aggre
10650 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
10660 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62  nd.** for variab
10670 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  les that need to
10680 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
10690 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
106a0 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61  array..** Make a
106b0 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
106c0 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  s to the pParse-
106d0 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73  >aAgg[] array as
106e0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
106f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
10700 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
10710 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
10720 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
10730 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
10740 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  y sqlite3ExprRes
10750 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a  olveNames()..**.
10760 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65  ** If errors are
10770 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20   seen, leave an 
10780 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
10790 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74   zErrMsg and ret
107a0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
107b0 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  r of errors..*/.
107c0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  int sqlite3ExprA
107d0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
107e0 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
107f0 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
10800 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e  .  int nErr = pN
10810 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b  C->pParse->nErr;
10820 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
10830 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67  pExpr, analyzeAg
10840 67 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20  gregate, pNC);. 
10850 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61   return pNC->pPa
10860 72 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72  rse->nErr - nErr
10870 3b 0a 7d 0a                                      ;.}.