/ Hex Artifact Content
Login

Artifact 24eda6c0502250f3a4259be94d6962f87cd47d87:


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 37 20 32 30 30 35 2f 30 38 2f 31 34 20  .217 2005/08/14 
0220: 32 30 3a 34 37 3a 31 36 20 64 72 68 20 45 78 70  20:47:16 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70 20 3d  xpr){.  int op =
04b0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04c0: 28 20 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a 20  ( op==TK_AS ){. 
04d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
04e0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
04f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d  xpr->pLeft);.  }
0500: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 53 45  .  if( op==TK_SE
0510: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
0520: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
0530: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53  finity(pExpr->pS
0540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
0550: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [0].pExpr);.  }.
0560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0570: 4d 49 54 5f 43 41 53 54 0a 20 20 69 66 28 20 6f  MIT_CAST.  if( o
0580: 70 3d 3d 54 4b 5f 43 41 53 54 20 29 7b 0a 20 20  p==TK_CAST ){.  
0590: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
05a0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45  AffinityType(&pE
05b0: 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 7d  xpr->token);.  }
05c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
05d0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
05e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
05f0: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  n the default co
0600: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0610: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0620: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0630: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0640: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74  ault collation t
0650: 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ype, return 0..*
0660: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
0670: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61  e3ExprCollSeq(Pa
0680: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0690: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
06a0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
06b0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
06c0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70      pColl = pExp
06d0: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  r->pColl;.    if
06e0: 28 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  ( (pExpr->op==TK
06f0: 5f 41 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _AS || pExpr->op
0700: 3d 3d 54 4b 5f 43 41 53 54 29 20 26 26 20 21 70  ==TK_CAST) && !p
0710: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
0720: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0730: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
0740: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
0750: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
0760: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
0770: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0780: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0790: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
07a0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
07b0: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
07c0: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
07d0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
07e0: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
07f0: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0800: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0810: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
0820: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
0830: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
0840: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
0850: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
0860: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0870: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0880: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0890: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
08a0: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
08b0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
08c0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
08d0: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
08e0: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
08f0: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0900: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0910: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
0920: 68 61 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a 20  has numeric or. 
0930: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66     ** integer af
0940: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
0950: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
0960: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
0970: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31   */.    if( aff1
0980: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
0990: 45 47 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51  EGER || aff2==SQ
09a0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
09b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
09c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
09d0: 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  GER;.    }else i
09e0: 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f  f( aff1==SQLITE_
09f0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
0a00: 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff2==SQLITE_AFF_
0a10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
0a20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0a30: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
0a40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
0a50: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0a60: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
0a70: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0a80: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0a90: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0aa0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0ab0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0ac0: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0ad0: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0ae0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20  ..    */.    /* 
0af0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0b00: 46 5f 4e 55 4d 45 52 49 43 3b 20 20 2f 2f 20 54  F_NUMERIC;  // T
0b10: 69 63 6b 65 74 20 23 38 30 35 20 2a 2f 0a 20 20  icket #805 */.  
0b20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0b30: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
0b40: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
0b50: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
0b60: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
0b70: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
0b80: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
0b90: 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31 3d     assert( aff1=
0ba0: 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b  =0 || aff2==0 );
0bb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66  .    return (aff
0bc0: 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d  1 + aff2);.  }.}
0bd0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0be0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0bf0: 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  erator.  Return 
0c00: 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74  the type affinit
0c10: 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  y that should.**
0c20: 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62   be applied to b
0c30: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69  oth operands pri
0c40: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20  or to doing the 
0c50: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73  comparison..*/.s
0c60: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61  tatic char compa
0c70: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78  risonAffinity(Ex
0c80: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68  pr *pExpr){.  ch
0c90: 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74  ar aff;.  assert
0ca0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0cb0: 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  EQ || pExpr->op=
0cc0: 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d  =TK_IN || pExpr-
0cd0: 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20  >op==TK_LT ||.  
0ce0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
0cf0: 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70  p==TK_GT || pExp
0d00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20  r->op==TK_GE || 
0d10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45  pExpr->op==TK_LE
0d20: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0d30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29  xpr->op==TK_NE )
0d40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
0d50: 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66  r->pLeft );.  af
0d60: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
0d70: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
0d80: 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78  Left);.  if( pEx
0d90: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
0da0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
0db0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
0dc0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
0dd0: 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69  f);.  }.  else i
0de0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
0df0: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
0e00: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
0e10: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65  inity(pExpr->pSe
0e20: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
0e30: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a  0].pExpr, aff);.
0e40: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21    }.  else if( !
0e50: 61 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d  aff ){.    aff =
0e60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
0e70: 52 49 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  RIC;.  }.  retur
0e80: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
0e90: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61  pExpr is a compa
0ea0: 72 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  rison expression
0eb0: 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20  , eg. '=', '<', 
0ec0: 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20  IN(...) etc..** 
0ed0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20  idx_affinity is 
0ee0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
0ef0: 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  an indexed colum
0f00: 6e 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a  n. Return true.*
0f10: 2a 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77  * if the index w
0f20: 69 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78  ith affinity idx
0f30: 5f 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65  _affinity may be
0f40: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
0f50: 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72  nt.** the compar
0f60: 69 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a  ison in pExpr..*
0f70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
0f80: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70  exAffinityOk(Exp
0f90: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69  r *pExpr, char i
0fa0: 64 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20  dx_affinity){.  
0fb0: 63 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61  char aff = compa
0fc0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
0fd0: 78 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a  xpr);.  return .
0fe0: 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45      (aff==SQLITE
0ff0: 5f 41 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20  _AFF_NONE) ||.  
1000: 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41    (aff==SQLITE_A
1010: 46 46 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64  FF_NUMERIC && id
1020: 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  x_affinity==SQLI
1030: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20  TE_AFF_INTEGER) 
1040: 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c  ||.    (aff==SQL
1050: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
1060: 26 26 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  && idx_affinity=
1070: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
1080: 52 49 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66  RIC) ||.    (aff
1090: 3d 3d 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b  ==idx_affinity);
10a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
10b0: 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 74 68   the P1 value th
10c0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
10d0: 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63  d for a binary c
10e0: 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63  omparison.** opc
10f0: 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47  ode (OP_Eq, OP_G
1100: 65 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20  e etc.) used to 
1110: 63 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61  compare pExpr1 a
1120: 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66  nd pExpr2..** If
1130: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74   jumpIfNull is t
1140: 72 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68  rue, then set th
1150: 65 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68  e low byte of th
1160: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31  e returned.** P1
1170: 20 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74   value to tell t
1180: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d  he opcode to jum
1190: 70 20 69 66 20 65 69 74 68 65 72 20 65 78 70 72  p if either expr
11a0: 65 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61  ession.** evalua
11b0: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a  tes to NULL..*/.
11c0: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72  static int binar
11d0: 79 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20  yCompareP1(Expr 
11e0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
11f0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
1200: 66 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61  fNull){.  char a
1210: 66 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ff = sqlite3Expr
1220: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
1230: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 69 6e 74  ;.  return ((int
1240: 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41  )sqlite3CompareA
1250: 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20  ffinity(pExpr1, 
1260: 61 66 66 29 29 2b 28 6a 75 6d 70 49 66 4e 75 6c  aff))+(jumpIfNul
1270: 6c 3f 30 78 31 30 30 3a 30 29 3b 0a 7d 0a 0a 2f  l?0x100:0);.}../
1280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1290: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c  inter to the col
12a0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12b0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
12c0: 73 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61  sed by.** a bina
12d0: 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  ry comparison op
12e0: 65 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67  erator comparing
12f0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
1300: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1310: 6c 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73  left hand expres
1320: 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61  sion has a colla
1330: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79  ting sequence ty
1340: 70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a  pe, then it is.*
1350: 2a 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73  * used. Otherwis
1360: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
1370: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
1380: 20 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72   right hand expr
1390: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65  ession.** is use
13a0: 64 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c  d, or the defaul
13b0: 74 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65  t (BINARY) if ne
13c0: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
13d0: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
13e0: 0a 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  .** type..*/.sta
13f0: 74 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e  tic CollSeq* bin
1400: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
1410: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
1420: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
1430: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43  pr *pRight){.  C
1440: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
1450: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
1460: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
1470: 29 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  );.  if( !pColl 
1480: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
1490: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
14a0: 71 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  q(pParse, pRight
14b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14c0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
14d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
14e0: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
14f0: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
1500: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
1510: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
1520: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
1530: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
1540: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
1550: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1560: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
1570: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
1580: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
1590: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
15a0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
15b0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
15c0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
15d0: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
15e0: 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
15f0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1600: 69 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69  if true.  */.  i
1610: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20  nt jumpIfNull   
1620: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d   /* If true, jum
1630: 70 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72  p if either oper
1640: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29  and is NULL */.)
1650: 7b 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e  {.  int p1 = bin
1660: 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65  aryCompareP1(pLe
1670: 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70  ft, pRight, jump
1680: 49 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53  IfNull);.  CollS
1690: 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43  eq *p3 = binaryC
16a0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
16b0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
16c0: 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  ght);.  return s
16d0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 50  qlite3VdbeOp3(pP
16e0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
16f0: 6f 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28  ode, p1, dest, (
1700: 76 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c  void*)p3, P3_COL
1710: 4c 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  LSEQ);.}../*.** 
1720: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
1730: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1740: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1750: 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d  nter to it.  Mem
1760: 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  ory.** for this 
1770: 6e 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64  node is obtained
1780: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
1790: 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69  oc().  The calli
17a0: 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
17b0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
17c0: 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  r making sure th
17d0: 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c  e node eventuall
17e0: 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f  y gets freed..*/
17f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1800: 70 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20  pr(int op, Expr 
1810: 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52  *pLeft, Expr *pR
1820: 69 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65  ight, const Toke
1830: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
1840: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  pr *pNew;.  pNew
1850: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1860: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b   sizeof(Expr) );
1870: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1880: 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61  {.    /* When ma
1890: 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 64 65 6c 65  lloc fails, dele
18a0: 74 65 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69  te pLeft and pRi
18b0: 67 68 74 2e 20 45 78 70 72 65 73 73 69 6f 6e 73  ght. Expressions
18c0: 20 70 61 73 73 65 64 20 74 6f 20 0a 20 20 20 20   passed to .    
18d0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
18e0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
18f0: 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 20 73  allocated with s
1900: 71 6c 69 74 65 33 45 78 70 72 28 29 20 66 6f 72  qlite3Expr() for
1910: 20 74 68 69 73 20 0a 20 20 20 20 2a 2a 20 72 65   this .    ** re
1920: 61 73 6f 6e 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ason. .    */.  
1930: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1940: 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20  ete(pLeft);.    
1950: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1960: 65 28 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72  e(pRight);.    r
1970: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1980: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
1990: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
19a0: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
19b0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
19c0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
19d0: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
19e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
19f0: 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20  ken->dyn==0 );. 
1a00: 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20     pNew->span = 
1a10: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
1a20: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  Token;.  }else i
1a30: 66 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67  f( pLeft && pRig
1a40: 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
1a50: 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77 2c 20  3ExprSpan(pNew, 
1a60: 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70  &pLeft->span, &p
1a70: 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20  Right->span);.  
1a80: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
1a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  .}../*.** When d
1aa0: 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61  oing a nested pa
1ab0: 72 73 65 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63  rse, you can inc
1ac0: 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  lude terms in an
1ad0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
1ae0: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
1af0: 69 73 3a 20 20 20 23 30 20 23 31 20 23 32 20 2e  is:   #0 #1 #2 .
1b00: 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  ..  These terms 
1b10: 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74  refer to element
1b20: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  s.** on the stac
1b30: 6b 2e 20 20 22 23 30 22 20 6d 65 61 6e 73 20 74  k.  "#0" means t
1b40: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
1b50: 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20 6d 65 61  ack..** "#1" mea
1b60: 6e 73 20 74 68 65 20 6e 65 78 74 20 64 6f 77 6e  ns the next down
1b70: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
1b80: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
1b90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ba0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1bb0: 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61 6c  e parser to deal
1bc0: 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f 73   with on of thos
1bd0: 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20 69  e terms..** It i
1be0: 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65 72  mmediately gener
1bf0: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74 6f  ates code to sto
1c00: 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
1c10: 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  a memory locatio
1c20: 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  n..** The return
1c30: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
1c40: 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20 74  that will code t
1c50: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61  o extract the va
1c60: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61 74  lue from.** that
1c70: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1c80: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 45   as needed..*/.E
1c90: 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67 69  xpr *sqlite3Regi
1ca0: 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20 2a  sterExpr(Parse *
1cb0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1cc0: 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20 2a  Token){.  Vdbe *
1cd0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ce0: 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  e;.  Expr *p;.  
1cf0: 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66 28  int depth;.  if(
1d00: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
1d10: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1d20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d30: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
1d40: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70  syntax error", p
1d50: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  Token);.    retu
1d60: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1d70: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
1d80: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
1d90: 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c 20  pr(TK_REGISTER, 
1da0: 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  0, 0, pToken);. 
1db0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
1dc0: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d   return 0;  /* M
1dd0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
1de0: 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61 74    }.  depth = at
1df0: 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  oi(&pToken->z[1]
1e00: 29 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  );.  p->iTable =
1e10: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
1e20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1e30: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64  dOp(v, OP_Dup, d
1e40: 65 70 74 68 2c 20 30 29 3b 0a 20 20 73 71 6c 69  epth, 0);.  sqli
1e50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1e60: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d 3e  OP_MemStore, p->
1e70: 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 72 65  iTable, 1);.  re
1e80: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1e90: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
1ea0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
1eb0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
1ec0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1ed0: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
1ee0: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1ef0: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
1f00: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
1f10: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
1f20: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1f30: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
1f40: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
1f50: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
1f60: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1f70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1f80: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
1f90: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
1fa0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1fb0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1fc0: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1fd0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
1fe0: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
1ff0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2000: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
2010: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
2020: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
2030: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
2040: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
2050: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
2060: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
2070: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
2080: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
2090: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
20a0: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
20b0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
20c0: 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26   && pRight->z &&
20d0: 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20   pLeft->z ){.   
20e0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
20f0: 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d  dyn==0 || pLeft-
2100: 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20  >z[pLeft->n]==0 
2110: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
2120: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
2130: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
2140: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2150: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
2160: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2170: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
2180: 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70 4c 65  (pRight->z - pLe
2190: 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ft->z);.    }els
21a0: 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e{.      pExpr->
21b0: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  span.z = 0;.    
21c0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
21d0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
21e0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
21f0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
2200: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
2210: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
2220: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
2230: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
2240: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
2250: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
2260: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73  pNew;.  pNew = s
2270: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
2280: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
2290: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22b0: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 20  tDelete(pList); 
22c0: 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67  /* Avoid leaking
22d0: 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c   memory when mal
22e0: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
22f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2300: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
2310: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
2320: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
2330: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
2340: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
2350: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
2360: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
2370: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65  *pToken;.  }else
2380: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
2390: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  n.z = 0;.  }.  p
23a0: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
23b0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72  ->token;.  retur
23c0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
23d0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
23e0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
23f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
2400: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
2410: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
2420: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
2430: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
2440: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
2450: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
2460: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
2470: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
2480: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
2490: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
24a0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
24b0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
24c0: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
24d0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
24e0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
24f0: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
2500: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
2510: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
2520: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
2530: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
2540: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
2550: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
2560: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
2570: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72  e form ":aaa" or
2580: 20 22 24 61 61 61 22 20 61 72 65 20 61 73 73 69   "$aaa" are assi
2590: 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20 6e 75  gned the same nu
25a0: 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65 20 70  mber.** as the p
25b0: 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e 63 65  revious instance
25c0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77 69 6c   of the same wil
25d0: 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20 74 68  dcard.  Or if th
25e0: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  is is the first.
25f0: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
2600: 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74 68 65  he wildcard, the
2610: 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61 6c 20   next sequenial 
2620: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2630: 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a  is.** assigned..
2640: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2650: 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62  xprAssignVarNumb
2660: 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
2670: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
2680: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b    Token *pToken;
2690: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
26a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 6f 6b  ) return;.  pTok
26b0: 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74 6f 6b  en = &pExpr->tok
26c0: 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  en;.  assert( pT
26d0: 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a 20 20  oken->n>=1 );.  
26e0: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
26f0: 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  z!=0 );.  assert
2700: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d  ( pToken->z[0]!=
2710: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65  0 );.  if( pToke
2720: 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  n->n==1 ){.    /
2730: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2740: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
2750: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
2760: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
2770: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2780: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
2790: 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ar;.  }else if( 
27a0: 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f  pToken->z[0]=='?
27b0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  ' ){.    /* Wild
27c0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
27d0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
27e0: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
27f0: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 2a 2a  teger and.    **
2800: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
2810: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
2820: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
2830: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2840: 20 69 20 3d 20 61 74 6f 69 28 26 70 54 6f 6b 65   i = atoi(&pToke
2850: 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20 69 66  n->z[1]);.    if
2860: 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c 49 54  ( i<1 || i>SQLIT
2870: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
2880: 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20 20 73  UMBER ){.      s
2890: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28a0: 50 61 72 73 65 2c 20 22 76 61 72 69 61 62 6c 65  Parse, "variable
28b0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20   number must be 
28c0: 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f  between ?1 and ?
28d0: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 53  %d",.          S
28e0: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
28f0: 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 20 20  LE_NUMBER);.    
2900: 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50 61 72  }.    if( i>pPar
2910: 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20  se->nVar ){.    
2920: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
2930: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   i;.    }.  }els
2940: 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  e{.    /* Wildca
2950: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
2960: 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22  ":aaa" or "$aaa"
2970: 2e 20 20 52 65 75 73 65 20 74 68 65 20 73 61 6d  .  Reuse the sam
2980: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  e variable.    *
2990: 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  * number as the 
29a0: 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65  prior appearance
29b0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
29c0: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d  e, or if the nam
29d0: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76  e.    ** has nev
29e0: 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f  er appeared befo
29f0: 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61  re, reuse the sa
2a00: 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  me variable numb
2a10: 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  er.    */.    in
2a20: 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20  t i, n;.    n = 
2a30: 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20 20 66  pToken->n;.    f
2a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
2a50: 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b 2b 29  ->nVarExpr; i++)
2a60: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
2a70: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 45 20  ;.      if( (pE 
2a80: 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  = pParse->apVarE
2a90: 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20 20 20  xpr[i])!=0.     
2aa0: 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f 6b 65       && pE->toke
2ab0: 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20 20 20  n.n==n.         
2ac0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d 3e 74   && memcmp(pE->t
2ad0: 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  oken.z, pToken->
2ae0: 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  z, n)==0 ){.    
2af0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2b00: 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65 3b 0a  e = pE->iTable;.
2b10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2b30: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
2b40: 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20 20 20  nVarExpr ){.    
2b50: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2b60: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  = ++pParse->nVar
2b70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
2b80: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d 70 50  se->nVarExpr>=pP
2b90: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c  arse->nVarExprAl
2ba0: 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  loc-1 ){.       
2bb0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70   pParse->nVarExp
2bc0: 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72 73 65  rAlloc += pParse
2bd0: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20  ->nVarExprAlloc 
2be0: 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 70 50  + 10;.        pP
2bf0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 20  arse->apVarExpr 
2c00: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
2c10: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2c20: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2c30: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
2c40: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2a  ->nVarExprAlloc*
2c50: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
2c60: 70 56 61 72 45 78 70 72 5b 30 5d 29 20 29 3b 0a  pVarExpr[0]) );.
2c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c80: 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ( !sqlite3_mallo
2c90: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
2ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
2cb0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21 3d 30  se->apVarExpr!=0
2cc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   );.        pPar
2cd0: 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 70 50  se->apVarExpr[pP
2ce0: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 2b 2b  arse->nVarExpr++
2cf0: 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  ] = pExpr;.     
2d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a   }.    }.  } .}.
2d10: 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65  ./*.** Recursive
2d20: 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70  ly delete an exp
2d30: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
2d40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2d50: 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70 29  rDelete(Expr *p)
2d60: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
2d70: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
2d80: 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74  span.dyn ) sqlit
2d90: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e  eFree((char*)p->
2da0: 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20 70  span.z);.  if( p
2db0: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73 71  ->token.dyn ) sq
2dc0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
2dd0: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73  p->token.z);.  s
2de0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2df0: 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73 71  (p->pLeft);.  sq
2e00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2e10: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73 71  p->pRight);.  sq
2e20: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2e30: 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20  ete(p->pList);. 
2e40: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2e50: 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74 29  lete(p->pSelect)
2e60: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
2e70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
2e80: 45 78 70 72 2e 74 6f 6b 65 6e 20 66 69 65 6c 64  Expr.token field
2e90: 20 6d 69 67 68 74 20 62 65 20 61 20 73 74 72 69   might be a stri
2ea0: 6e 67 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20  ng literal that 
2eb0: 69 73 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 49 66  is quoted..** If
2ec0: 20 73 6f 2c 20 72 65 6d 6f 76 65 20 74 68 65 20   so, remove the 
2ed0: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 2e  quotation marks.
2ee0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2ef0: 44 65 71 75 6f 74 65 45 78 70 72 28 45 78 70 72  DequoteExpr(Expr
2f00: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
2f10: 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70  HasAnyProperty(p
2f20: 2c 20 45 50 5f 44 65 71 75 6f 74 65 64 29 20 29  , EP_Dequoted) )
2f30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
2f40: 7d 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  }.  ExprSetPrope
2f50: 72 74 79 28 70 2c 20 45 50 5f 44 65 71 75 6f 74  rty(p, EP_Dequot
2f60: 65 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  ed);.  if( p->to
2f70: 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ken.dyn==0 ){.  
2f80: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
2f90: 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20 70 2d  BLOB ){.      p-
2fa0: 3e 74 6f 6b 65 6e 2e 6e 2d 2d 3b 0a 20 20 20 20  >token.n--;.    
2fb0: 20 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 2b 2b 3b 0a    p->token.z++;.
2fc0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2fd0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 2d 3e 74  3TokenCopy(&p->t
2fe0: 6f 6b 65 6e 2c 20 26 70 2d 3e 74 6f 6b 65 6e 29  oken, &p->token)
2ff0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
3000: 65 71 75 6f 74 65 28 28 63 68 61 72 2a 29 70 2d  equote((char*)p-
3010: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 7d 0a 0a 0a 2f  >token.z);.}.../
3020: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
3030: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
3040: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
3050: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
3060: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
3070: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
3080: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
3090: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
30a0: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
30b0: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
30c0: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
30d0: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
30e0: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
30f0: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
3100: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
3110: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
3120: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
3130: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
3140: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
3150: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
3160: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
3170: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
3180: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
3190: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
31a0: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
31b0: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
31c0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
31d0: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
31e0: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
31f0: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
3200: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
3210: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
3220: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
3230: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3240: 65 33 45 78 70 72 44 75 70 28 45 78 70 72 20 2a  e3ExprDup(Expr *
3250: 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  p){.  Expr *pNew
3260: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
3270: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
3280: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3290: 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  w( sizeof(*p) );
32a0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
32b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
32c0: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
32d0: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
32e0: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
32f0: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
3300: 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69 74 65 53 74  ken.z = sqliteSt
3310: 72 4e 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a  rNDup(p->token.z
3320: 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  , p->token.n);. 
3330: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64     pNew->token.d
3340: 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  yn = 1;.  }else{
3350: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
3360: 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b  w->token.z==0 );
3370: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61  .  }.  pNew->spa
3380: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  n.z = 0;.  pNew-
3390: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
33a0: 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74  ExprDup(p->pLeft
33b0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68  );.  pNew->pRigh
33c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
33d0: 75 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  up(p->pRight);. 
33e0: 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73   pNew->pList = s
33f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3400: 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70  p(p->pList);.  p
3410: 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  New->pSelect = s
3420: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
3430: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  p->pSelect);.  p
3440: 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 2d 3e 70  New->pTab = p->p
3450: 54 61 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  Tab;.  return pN
3460: 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  ew;.}.void sqlit
3470: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65  e3TokenCopy(Toke
3480: 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70  n *pTo, Token *p
3490: 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f  From){.  if( pTo
34a0: 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72  ->dyn ) sqliteFr
34b0: 65 65 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a  ee((char*)pTo->z
34c0: 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
34d0: 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20  z ){.    pTo->n 
34e0: 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20  = pFrom->n;.    
34f0: 70 54 6f 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 53  pTo->z = sqliteS
3500: 74 72 4e 44 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c  trNDup(pFrom->z,
3510: 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20   pFrom->n);.    
3520: 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20  pTo->dyn = 1;.  
3530: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e  }else{.    pTo->
3540: 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70  z = 0;.  }.}.Exp
3550: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
3560: 70 72 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69  prListDup(ExprLi
3570: 73 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69  st *p){.  ExprLi
3580: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75  st *pNew;.  stru
3590: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
35a0: 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74   *pItem, *pOldIt
35b0: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
35c0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
35d0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
35e0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
35f0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
3600: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3610: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45  rn 0;.  pNew->nE
3620: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
3630: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
3640: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
3650: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
3660: 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66   p->nExpr*sizeof
3670: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
3680: 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20  f( pItem==0 ){. 
3690: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e     sqliteFree(pN
36a0: 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ew);.    return 
36b0: 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74  0;.  } .  pOldIt
36c0: 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72  em = p->a;.  for
36d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
36e0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20  ; i++, pItem++, 
36f0: 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pOldItem++){.   
3700: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c   Expr *pNewExpr,
3710: 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20   *pOldExpr;.    
3720: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
3730: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
3740: 33 45 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70  3ExprDup(pOldExp
3750: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45  r = pOldItem->pE
3760: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  xpr);.    if( pO
3770: 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d  ldExpr->span.z!=
3780: 30 20 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b  0 && pNewExpr ){
3790: 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  .      /* Always
37a0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
37b0: 74 68 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70  the span for top
37c0: 2d 6c 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f  -level expressio
37d0: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
37e0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
37f0: 73 74 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69  st.  The logic i
3800: 6e 20 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73  n SELECT process
3810: 69 6e 67 20 74 68 61 74 20 64 65 74 65 72 6d 69  ing that determi
3820: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nes.      ** the
3830: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
3840: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
3850: 73 65 74 20 6e 65 65 64 73 20 74 68 69 73 20 69  set needs this i
3860: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
3870: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
3880: 43 6f 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e  Copy(&pNewExpr->
3890: 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d  span, &pOldExpr-
38a0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
38b0: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 45 78    assert( pNewEx
38c0: 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70  pr==0 || pNewExp
38d0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20  r->span.z!=0 .  
38e0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c            || pOl
38f0: 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30  dExpr->span.z==0
3900: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
3910: 6f 63 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20  oc_failed );.   
3920: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
3930: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
3940: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
3950: 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72     pItem->sortOr
3960: 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  der = pOldItem->
3970: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
3980: 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f  Item->isAgg = pO
3990: 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20  ldItem->isAgg;. 
39a0: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
39b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
39c0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
39d0: 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67  If cursors, trig
39e0: 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20  gers, views and 
39f0: 73 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61  subqueries are a
3a00: 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a  ll omitted from.
3a10: 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68  ** the build, th
3a20: 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66  en none of the f
3a30: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
3a40: 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a  s, except for .*
3a50: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  * sqlite3SelectD
3a60: 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c  up(), can be cal
3a70: 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65  led. sqlite3Sele
3a80: 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74  ctDup() is somet
3a90: 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  imes.** called w
3aa0: 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d  ith a NULL argum
3ab0: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ent..*/.#if !def
3ac0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3ad0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
3ae0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
3af0: 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64  RIGGER) \. || !d
3b00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3b10: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63  IT_SUBQUERY).Src
3b20: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
3b30: 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74 20  ListDup(SrcList 
3b40: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
3b50: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
3b60: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
3b70: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
3b80: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
3b90: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
3ba0: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
3bb0: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
3bc0: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
3bd0: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
3be0: 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  Raw( nByte );.  
3bf0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
3c00: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
3c10: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
3c20: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
3c30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
3c40: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
3c50: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3c60: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
3c70: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
3c80: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3c90: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
3ca0: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61  &p->a[i];.    Ta
3cb0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
3cc0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
3cd0: 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  se = sqliteStrDu
3ce0: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  p(pOldItem->zDat
3cf0: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
3d00: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
3d10: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
3d20: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
3d30: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61   pNewItem->zAlia
3d40: 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  s = sqliteStrDup
3d50: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61  (pOldItem->zAlia
3d60: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
3d70: 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c  ->jointype = pOl
3d80: 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  dItem->jointype;
3d90: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
3da0: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
3db0: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
3dc0: 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d  pTab = pNewItem-
3dd0: 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d  >pTab = pOldItem
3de0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
3df0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54  pTab ){.      pT
3e00: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
3e10: 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  }.    pNewItem->
3e20: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
3e30: 33 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49  3SelectDup(pOldI
3e40: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
3e50: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
3e60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
3e70: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29  p(pOldItem->pOn)
3e80: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3e90: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
3ea0: 49 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49 74  IdListDup(pOldIt
3eb0: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20  em->pUsing);.   
3ec0: 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73   pNewItem->colUs
3ed0: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63  ed = pOldItem->c
3ee0: 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65  olUsed;.  }.  re
3ef0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
3f00: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
3f10: 73 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29  stDup(IdList *p)
3f20: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
3f30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3f40: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3f50: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3f60: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
3f70: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
3f80: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3f90: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
3fa0: 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  Id = pNew->nAllo
3fb0: 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  c = p->nId;.  pN
3fc0: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61  ew->a = sqliteMa
3fd0: 6c 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a  llocRaw( p->nId*
3fe0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
3ff0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
4000: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4010: 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
4020: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
4030: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
4040: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
4050: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
4060: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
4070: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
4080: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
4090: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
40a0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
40b0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
40c0: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
40d0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
40e0: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
40f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
4100: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
4110: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
4120: 74 65 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c  te3SelectDup(Sel
4130: 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63  ect *p){.  Selec
4140: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70  t *pNew;.  if( p
4150: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4160: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
4170: 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
4180: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
4190: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
41a0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74  ;.  pNew->isDist
41b0: 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
41c0: 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45  inct;.  pNew->pE
41d0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
41e0: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c  prListDup(p->pEL
41f0: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
4200: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
4210: 69 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b  istDup(p->pSrc);
4220: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
4230: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4240: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70  (p->pWhere);.  p
4250: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
4260: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4270: 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  up(p->pGroupBy);
4280: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
4290: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
42a0: 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  p(p->pHaving);. 
42b0: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
42c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
42d0: 74 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79  tDup(p->pOrderBy
42e0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  );.  pNew->op = 
42f0: 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70  p->op;.  pNew->p
4300: 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53  Prior = sqlite3S
4310: 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69  electDup(p->pPri
4320: 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  or);.  pNew->pLi
4330: 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mit = sqlite3Exp
4340: 72 44 75 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  rDup(p->pLimit);
4350: 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
4360: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4370: 70 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  p(p->pOffset);. 
4380: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
4390: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66  -1;.  pNew->iOff
43a0: 73 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  set = -1;.  pNew
43b0: 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61 6c 20  ->ppOpenVirtual 
43c0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 52  = 0;.  pNew->isR
43d0: 65 73 6f 6c 76 65 64 20 3d 20 70 2d 3e 69 73 52  esolved = p->isR
43e0: 65 73 6f 6c 76 65 64 3b 0a 20 20 70 4e 65 77 2d  esolved;.  pNew-
43f0: 3e 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67  >isAgg = p->isAg
4400: 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  g;.  return pNew
4410: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
4420: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
4430: 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  up(Select *p){. 
4440: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
4450: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
4460: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  endif.../*.** Ad
4470: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
4480: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e  to the end of an
4490: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
44a0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a  .  If pList is.*
44b0: 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c  * initially NULL
44c0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
44d0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  new expression l
44e0: 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74  ist..*/.ExprList
44f0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
4500: 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74  tAppend(ExprList
4510: 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70   *pList, Expr *p
4520: 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  Expr, Token *pNa
4530: 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  me){.  if( pList
4540: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
4550: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
4560: 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74   sizeof(ExprList
4570: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
4580: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  st==0 ){.      g
4590: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
45a0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
45b0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29  ist->nAlloc==0 )
45c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
45d0: 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74  t->nAlloc<=pList
45e0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
45f0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
4600: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 69 6e 74 20  tem *a;.    int 
4610: 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  n = pList->nAllo
4620: 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 61 20 3d  c*2 + 4;.    a =
4630: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
4640: 4c 69 73 74 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f  List->a, n*sizeo
4650: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
4660: 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  .    if( a==0 ){
4670: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  .      goto no_m
4680: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  em;.    }.    pL
4690: 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20  ist->a = a;.    
46a0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
46b0: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
46c0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a   pList->a!=0 );.
46d0: 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70    if( pExpr || p
46e0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75  Name ){.    stru
46f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
4700: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
4710: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
4720: 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ++];.    memset(
4730: 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
4740: 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70  (*pItem));.    p
4750: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
4760: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4770: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 70  en(pName);.    p
4780: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45  Item->pExpr = pE
4790: 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  xpr;.  }.  retur
47a0: 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d  n pList;..no_mem
47b0: 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69  :     .  /* Avoi
47c0: 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79  d leaking memory
47d0: 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66   if malloc has f
47e0: 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69  ailed. */.  sqli
47f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
4800: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
4810: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
4820: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
4830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4840: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
4850: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
4860: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
4870: 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c  ListDelete(ExprL
4880: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
4890: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
48a0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
48b0: 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
48c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
48d0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
48e0: 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e  !=0 || (pList->n
48f0: 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74  Expr==0 && pList
4900: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a  ->nAlloc==0) );.
4910: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
4920: 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e  >nExpr<=pList->n
4930: 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70  Alloc );.  for(p
4940: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
4950: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
4960: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
4970: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4980: 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
4990: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
49a0: 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e  teFree(pItem->zN
49b0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
49c0: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
49d0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
49e0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
49f0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
4a00: 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78  on tree.  Call x
4a10: 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f  Func for each no
4a20: 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a  de visited..**.*
4a30: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
4a40: 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65  ue from xFunc de
4a50: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
4a60: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63   the tree walk c
4a70: 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d  ontinues..** 0 m
4a80: 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61  eans continue wa
4a90: 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20  lking the tree. 
4aa0: 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20   1 means do not 
4ab0: 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a  walk children.**
4ac0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
4ad0: 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75  node but continu
4ae0: 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e  e with siblings.
4af0: 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f    2 means abando
4b00: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61  n.** the tree wa
4b10: 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a  lk completely..*
4b20: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
4b30: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20  value from this 
4b40: 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20  routine is 1 to 
4b50: 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65  abandon the tree
4b60: 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74   walk.** and 0 t
4b70: 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2f 0a 73  o continue..*/.s
4b80: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
4b90: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
4ba0: 2a 2c 20 69 6e 74 20 28 2a 29 28 76 6f 69 64 20  *, int (*)(void 
4bb0: 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20  *, Expr*), void 
4bc0: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
4bd0: 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70 72  alkExprTree(Expr
4be0: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a 78   *pExpr, int (*x
4bf0: 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70 72  Func)(void*,Expr
4c00: 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  *), void *pArg){
4c10: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
4c20: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
4c30: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78  rn 0;.  rc = (*x
4c40: 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70  Func)(pArg, pExp
4c50: 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  r);.  if( rc==0 
4c60: 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  ){.    if( walkE
4c70: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
4c80: 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  Left, xFunc, pAr
4c90: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
4ca0: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
4cb0: 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ree(pExpr->pRigh
4cc0: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  t, xFunc, pArg) 
4cd0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
4ce0: 69 66 28 20 77 61 6c 6b 45 78 70 72 4c 69 73 74  if( walkExprList
4cf0: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 78  (pExpr->pList, x
4d00: 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65  Func, pArg) ) re
4d10: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
4d20: 74 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a  turn rc>1;.}../*
4d30: 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45 78 70  .** Call walkExp
4d40: 72 54 72 65 65 28 29 20 66 6f 72 20 65 76 65 72  rTree() for ever
4d50: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
4d60: 6c 69 73 74 20 70 2e 0a 2a 2f 0a 73 74 61 74 69  list p..*/.stati
4d70: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69  c int walkExprLi
4d80: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  st(ExprList *p, 
4d90: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f 69  int (*xFunc)(voi
4da0: 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69  d *, Expr*), voi
4db0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
4dc0: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
4dd0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
4de0: 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
4df0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 70  urn 0;.  for(i=p
4e00: 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
4e10: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
4e20: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
4e30: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49   walkExprTree(pI
4e40: 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e  tem->pExpr, xFun
4e50: 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72  c, pArg) ) retur
4e60: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
4e70: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  n 0;.}../*.** Ca
4e80: 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  ll walkExprTree(
4e90: 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
4ea0: 65 73 73 69 6f 6e 20 69 6e 20 53 65 6c 65 63 74  ession in Select
4eb0: 20 70 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e   p, not includin
4ec0: 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  g.** expressions
4ed0: 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f   that are part o
4ee0: 66 20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e  f sub-selects in
4ef0: 20 61 6e 79 20 46 52 4f 4d 20 63 6c 61 75 73 65   any FROM clause
4f00: 20 6f 72 20 74 68 65 20 4c 49 4d 49 54 0a 2a 2a   or the LIMIT.**
4f10: 20 6f 72 20 4f 46 46 53 45 54 20 65 78 70 72 65   or OFFSET expre
4f20: 73 73 69 6f 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74  ssions...*/.stat
4f30: 69 63 20 69 6e 74 20 77 61 6c 6b 53 65 6c 65 63  ic int walkSelec
4f40: 74 45 78 70 72 28 53 65 6c 65 63 74 20 2a 70 2c  tExpr(Select *p,
4f50: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
4f60: 69 64 20 2a 2c 20 45 78 70 72 2a 29 2c 20 76 6f  id *, Expr*), vo
4f70: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 61 6c  id *pArg){.  wal
4f80: 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  kExprList(p->pEL
4f90: 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ist, xFunc, pArg
4fa0: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65  );.  walkExprTre
4fb0: 65 28 70 2d 3e 70 57 68 65 72 65 2c 20 78 46 75  e(p->pWhere, xFu
4fc0: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
4fd0: 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  kExprList(p->pGr
4fe0: 6f 75 70 42 79 2c 20 78 46 75 6e 63 2c 20 70 41  oupBy, xFunc, pA
4ff0: 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  rg);.  walkExprT
5000: 72 65 65 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ree(p->pHaving, 
5010: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
5020: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 2d 3e  walkExprList(p->
5030: 70 4f 72 64 65 72 42 79 2c 20 78 46 75 6e 63 2c  pOrderBy, xFunc,
5040: 20 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e   pArg);.  return
5050: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
5060: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65  is routine is de
5070: 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75  signed as an xFu
5080: 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54  nc for walkExprT
5090: 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72  ree()..**.** pAr
50a0: 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  g is really a po
50b0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
50c0: 67 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20  ger.  If we can 
50d0: 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a  tell by looking.
50e0: 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68 61 74  ** at pExpr that
50f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5100: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45  that contains pE
5110: 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e  xpr is not a con
5120: 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73  stant.** express
5130: 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ion, then set *p
5140: 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74  Arg to 0 and ret
5150: 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e  urn 2 to abandon
5160: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
5170: 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65 73  ** If pExpr does
5180: 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61   does not disqua
5190: 6c 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  lify the express
51a0: 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61  ion from being a
51b0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65   constant.** the
51c0: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  n do nothing..**
51d0: 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e  .** After walkin
51e0: 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65  g the whole tree
51f0: 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72  , if no nodes ar
5200: 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73  e found that dis
5210: 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65  qualify.** the e
5220: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e  xpression as con
5230: 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61  stant, then we a
5240: 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20  ssume the whole 
5250: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
5260: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20   constant.  See 
5270: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
5280: 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69  stant() for addi
5290: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
52a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
52b0: 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
52c0: 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c  tant(void *pArg,
52d0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
52e0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
52f0: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e  op ){.    /* Con
5300: 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  sider functions 
5310: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69  to be constant i
5320: 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75  f all their argu
5330: 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61  ments are consta
5340: 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 2a 70  nt.    ** and *p
5350: 41 72 67 3d 3d 32 20 2a 2f 0a 20 20 20 20 63 61  Arg==2 */.    ca
5360: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
5370: 20 20 20 20 20 20 69 66 28 20 2a 28 28 69 6e 74        if( *((int
5380: 2a 29 70 41 72 67 29 3d 3d 32 20 29 20 72 65 74  *)pArg)==2 ) ret
5390: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 0;.      /* 
53a0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
53b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
53c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
53d0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
53e0: 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  DOT:.    case TK
53f0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 23  _AGG_FUNCTION:.#
5400: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5410: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
5420: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
5430: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
5440: 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  TS:.#endif.     
5450: 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20 3d   *((int*)pArg) =
5460: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
5470: 20 32 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   2;.    default:
5480: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
5490: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  .  }.}../*.** Wa
54a0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
54b0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
54c0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
54d0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
54e0: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
54f0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
5500: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
5510: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
5520: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
5530: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
5540: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
5550: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
5560: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
5570: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
5580: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
5590: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
55a0: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
55b0: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
55c0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
55d0: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  t(Expr *p){.  in
55e0: 74 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20  t isConst = 1;. 
55f0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c   walkExprTree(p,
5600: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
5610: 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a  ant, &isConst);.
5620: 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74    return isConst
5630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
5640: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
5650: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
5660: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5670: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f  is constant.** o
5680: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  r a function cal
5690: 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20  l with constant 
56a0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
56b0: 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65 72  rn and 0 if ther
56c0: 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72  e.** are any var
56d0: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
56e0: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
56f0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
5700: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
5710: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
5720: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
5730: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
5740: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
5750: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
5760: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
5770: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
5780: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
5790: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
57a0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
57b0: 69 73 43 6f 6e 73 74 20 3d 20 32 3b 0a 20 20 77  isConst = 2;.  w
57c0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20 65  alkExprTree(p, e
57d0: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
57e0: 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20 20  t, &isConst);.  
57f0: 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 21 3d  return isConst!=
5800: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  0;.}../*.** If t
5810: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20  he expression p 
5820: 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74  codes a constant
5830: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73   integer that is
5840: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a   small enough.**
5850: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d   to fit in a 32-
5860: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
5870: 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68  urn 1 and put th
5880: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
5890: 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56  nteger.** in *pV
58a0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78  alue.  If the ex
58b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
58c0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66  an integer or if
58d0: 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a   it is too big.*
58e0: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69  * to fit in a si
58f0: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
5900: 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e  ger, return 0 an
5910: 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20  d leave *pValue 
5920: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
5930: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  t sqlite3ExprIsI
5940: 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20  nteger(Expr *p, 
5950: 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  int *pValue){.  
5960: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
5970: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
5980: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66  EGER: {.      if
5990: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
59a0: 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56  2(p->token.z, pV
59b0: 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20  alue) ){.       
59c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
59d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
59e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
59f0: 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
5a00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
5a10: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
5a20: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
5a30: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
5a40: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
5a50: 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
5a60: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
5a70: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
5a80: 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
5a90: 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20   *pValue = -v;. 
5aa0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5ab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5ac0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5ad0: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
5ae0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5af0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5b00: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
5b10: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
5b20: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
5b30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5b40: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
5b50: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
5b60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5b70: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
5b80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
5b90: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5ba0: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
5bb0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
5bc0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5bd0: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
5be0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
5bf0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0;.}../*.** Giv
5c00: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
5c10: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
5c20: 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a  orm X.Y.Z or Y.Z
5c30: 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b   or just Z, look
5c40: 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65   up.** that name
5c50: 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73   in the set of s
5c60: 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20  ource tables in 
5c70: 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b  pSrcList and mak
5c80: 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20  e the pExpr .** 
5c90: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
5ca0: 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68  refer back to th
5cb0: 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e  at source column
5cc0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
5cd0: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
5ce0: 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a  made to pExpr:.*
5cf0: 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  *.**    pExpr->i
5d00: 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74  Db           Set
5d10: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62   the index in db
5d20: 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64  ->aDb[] of the d
5d30: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a  atabase holding.
5d40: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
5d50: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
5d60: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70  able..**    pExp
5d70: 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20  r->iTable       
5d80: 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73   Set to the curs
5d90: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
5da0: 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64  e table obtained
5db0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
5dd0: 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20   pSrcList..**   
5de0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
5df0: 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65        Set to the
5e00: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
5e10: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ithin the table.
5e20: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .**    pExpr->op
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
5e40: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a  to TK_COLUMN..**
5e50: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
5e60: 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70           Any exp
5e70: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
5e80: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
5e90: 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  d.**    pExpr->p
5ea0: 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79  Right        Any
5eb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
5ec0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
5ed0: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
5ee0: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65   pDbToken is the
5ef0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
5f00: 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e  abase (the "X").
5f10: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
5f20: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e   be.** NULL mean
5f30: 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73  ing that name is
5f40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a   of the form Y.Z
5f50: 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69   or Z.  Any avai
5f60: 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a  lable database.*
5f70: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20  * can be used.  
5f80: 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20  The pTableToken 
5f90: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
5fa0: 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59  he table (the "Y
5fb0: 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c  ").  This.** val
5fc0: 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69  ue can be NULL i
5fd0: 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c  f pDbToken is al
5fe0: 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61  so NULL.  If pTa
5ff0: 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  bleToken is NULL
6000: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61   it.** means tha
6010: 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68  t the form of th
6020: 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20  e name is Z and 
6030: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  that columns fro
6040: 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63  m any table.** c
6050: 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  an be used..**.*
6060: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61  * If the name ca
6070: 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64  nnot be resolved
6080: 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20   unambiguously, 
6090: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
60a0: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
60b0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
60c0: 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e  on-zero.  Return
60d0: 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73   zero on success
60e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
60f0: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61  lookupName(.  Pa
6100: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6110: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
6120: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
6130: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
6140: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
6150: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
6160: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
6170: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
6180: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
6190: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
61a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
61b0: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
61c0: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
61d0: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
61e0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
61f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
6200: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
6210: 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74  e context used t
6220: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61  o resolve the na
6230: 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  me */.  Expr *pE
6240: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
6250: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
6260: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
6270: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
6280: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
6290: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
62a0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
62b0: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
62c0: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
62d0: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
62e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
62f0: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
6300: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
6310: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
6320: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
6330: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
6340: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
6350: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
6360: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
6370: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
6380: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
6390: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
63a0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
63b0: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  mes */.  int cnt
63c0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
63d0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
63e0: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
63f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
6400: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
6410: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
6420: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
6430: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
6440: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f         /* Use fo
6450: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
6460: 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f  SrcList items */
6470: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
6480: 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d  t_item *pMatch =
6490: 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63   0;  /* The matc
64a0: 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74  hing pSrcList it
64b0: 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  em */.  NameCont
64c0: 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e  ext *pTopNC = pN
64d0: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  C;        /* Fir
64e0: 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69  st namecontext i
64f0: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20  n the list */.. 
6500: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
6510: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
6520: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
6530: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
6540: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
6550: 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e    zDb = sqlite3N
6560: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62  ameFromToken(pDb
6570: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d  Token);.  zTab =
6580: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
6590: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65  Token(pTableToke
65a0: 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c  n);.  zCol = sql
65b0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
65c0: 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b  n(pColumnToken);
65d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
65e0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
65f0: 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e      goto lookupn
6600: 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ame_end;.  }..  
6610: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
6620: 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43  -1;.  while( pNC
6630: 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   && cnt==0 ){.  
6640: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
6650: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
6660: 69 73 74 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ist;.    ExprLis
6670: 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d  t *pEList = pNC-
6680: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a  >pEList;..    /*
6690: 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30   assert( zTab==0
66a0: 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 29 3b   || pEList==0 );
66b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
66c0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  List ){.      fo
66d0: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
66e0: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
66f0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
6700: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
6710: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
6720: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
6730: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
6740: 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 69  ol;.  .        i
6750: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e  f( pTab==0 ) con
6760: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
6770: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
6780: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
6790: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
67a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
67b0: 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
67c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
67d0: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
67e0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
67f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6800: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
6810: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
6820: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ue;.          }e
6830: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
6840: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
6850: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
6860: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
6870: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  TabName==0 || sq
6880: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
6890: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
68a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
68b0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21          if( zDb!
68c0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
68d0: 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 70 54 61  ICmp(db->aDb[pTa
68e0: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a  b->iDb].zName, z
68f0: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
6900: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
6910: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6920: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6940: 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20  ( 0==(cntTab++) 
6950: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
6960: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
6970: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
6980: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
6990: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
69a0: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
69b0: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
69c0: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a   }.        for(j
69d0: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
69e0: 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
69f0: 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; j++, pCol++){
6a00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
6a10: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
6a20: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
6a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6a40: 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e     IdList *pUsin
6a50: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  g;.            c
6a60: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
6a70: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6a80: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
6a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
6aa0: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
6ab0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6ac0: 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62  >iDb = pTab->iDb
6ad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
6ae0: 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20   Substitute the 
6af0: 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31  rowid (column -1
6b00: 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  ) for the INTEGE
6b10: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
6b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6b30: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
6b40: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
6b50: 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  1 : j;.         
6b60: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
6b70: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
6b80: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
6b90: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6ba0: 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  pColl = pTab->aC
6bb0: 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20  ol[j].pColl;.   
6bc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
6bd0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
6be0: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
6bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
6c00: 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75   this match occu
6c10: 72 72 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74  rred in the left
6c20: 20 74 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75   table of a natu
6c30: 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20  ral join,.      
6c40: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
6c50: 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74  skip the right t
6c60: 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20  able to avoid a 
6c70: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
6c80: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
6c90: 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20   pItem++;.      
6ca0: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
6cb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6cc0: 20 20 20 20 20 20 20 69 66 28 20 28 70 55 73 69         if( (pUsi
6cd0: 6e 67 20 3d 20 70 49 74 65 6d 2d 3e 70 55 73 69  ng = pItem->pUsi
6ce0: 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ng)!=0 ){.      
6cf0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
6d00: 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20  is match occurs 
6d10: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  on a column that
6d20: 20 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47   is in the USING
6d30: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
6d40: 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f        ** of a jo
6d50: 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65 61  in, skip the sea
6d60: 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68 74  rch of the right
6d70: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
6d80: 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  in.             
6d90: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64   ** to avoid a d
6da0: 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74  uplicate match t
6db0: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
6dc0: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
6de0: 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e  k=0; k<pUsing->n
6df0: 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; k++){.      
6e00: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
6e10: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 73  lite3StrICmp(pUs
6e20: 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c  ing->a[k].zName,
6e30: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6e50: 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Item++;.        
6e60: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6e90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ea0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6ed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6ef0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6f00: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
6f10: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
6f20: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
6f30: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
6f40: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20  n maybe .    ** 
6f50: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
6f60: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
6f70: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
6f80: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
6f90: 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21   zDb==0 && zTab!
6fa0: 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20  =0 && cnt==0 && 
6fb0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
6fc0: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72  k!=0 ){.      Tr
6fd0: 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69  iggerStack *pTri
6fe0: 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72  ggerStack = pPar
6ff0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20  se->trigStack;. 
7000: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
7010: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
7020: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
7030: 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ewIdx != -1 && s
7040: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e  qlite3StrICmp("n
7050: 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ew", zTab) == 0 
7060: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
7070: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
7080: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
7090: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
70a0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
70b0: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
70c0: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
70d0: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
70e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
70f0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
7100: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
7110: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
7120: 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , zTab)==0 ){.  
7130: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
7140: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
7150: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
7160: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
7170: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
7180: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
7190: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
71a0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a  ->pTab;.      }.
71b0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
71c0: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){ .        int 
71d0: 6a 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  j;.        Colum
71e0: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
71f0: 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70  aCol;..        p
7200: 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62  Expr->iDb = pTab
7210: 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 63  ->iDb;.        c
7220: 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  ntTab++;.       
7230: 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54   for(j=0; j < pT
7240: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
7250: 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  Col++) {.       
7260: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
7270: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
7280: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
7290: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
72a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
72b0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
72c0: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
72d0: 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20  -1 : j;.        
72e0: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
72f0: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
7300: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
7310: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7320: 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  >pColl = pTab->a
7330: 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20  Col[j].pColl;.  
7340: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7350: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
7360: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
7370: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7390: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21     }.#endif /* !
73a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
73b0: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a  MIT_TRIGGER) */.
73c0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
73d0: 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20  erhaps the name 
73e0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
73f0: 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20  o the ROWID.    
7400: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
7410: 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26  0 && cntTab==1 &
7420: 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
7430: 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  (zCol) ){.      
7440: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  cnt = 1;.      p
7450: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
7460: 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  -1;.      pExpr-
7470: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
7480: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
7490: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
74a0: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75    ** If the inpu
74b0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
74c0: 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58   Z (not Y.Z or X
74d0: 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e  .Y.Z) then the n
74e0: 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67  ame Z.    ** mig
74f0: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
7500: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
7510: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
7520: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
7530: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20  n.    ** we are 
7540: 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20  resolving names 
7550: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
7560: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  use of the follo
7570: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20  wing command:.  
7580: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
7590: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20  SELECT a+b AS x 
75a0: 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45  FROM table WHERE
75b0: 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20   x<10;.    **.  
75c0: 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69    ** In cases li
75d0: 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65  ke this, replace
75e0: 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f   pExpr with a co
75f0: 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
7600: 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a  sion that.    **
7610: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c   forms the resul
7620: 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b  t set entry ("a+
7630: 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  b" in the exampl
7640: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  e) and return im
7650: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
7660: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
7670: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
7680: 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f  e result set sho
7690: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
76a0: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73   been.    ** res
76b0: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
76c0: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
76d0: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
76e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
76f0: 6e 74 3d 3d 30 20 26 26 20 70 45 4c 69 73 74 21  nt==0 && pEList!
7700: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b  =0 && zTab==0 ){
7710: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7720: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
7730: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
7740: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
7750: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
7760: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
7770: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
7780: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
7790: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
77a0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
77b0: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
77c0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
77d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
77e0: 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20  p = TK_AS;.     
77f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7800: 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
7810: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
7820: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7830: 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  (pEList->a[j].pE
7840: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
7850: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cnt = 1;.       
7860: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
7870: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
7880: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c            goto l
7890: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b  ookupname_end_2;
78a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
78b0: 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   } .    }..    /
78c0: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
78d0: 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65   next name conte
78e0: 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69  xt.  The loop wi
78f0: 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74  ll exit when eit
7900: 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61  her.    ** we ha
7910: 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e  ve a match (cnt>
7920: 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75  0) or when we ru
7930: 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f  n out of name co
7940: 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ntexts..    */. 
7950: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b     if( cnt==0 ){
7960: 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43  .      pNC = pNC
7970: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
7980: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
7990: 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c   X and Y are NUL
79a0: 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  L (in other word
79b0: 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f  s if only the co
79c0: 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20  lumn name Z is. 
79d0: 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e   ** supplied) an
79e0: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a  d the value of Z
79f0: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
7a00: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74  double-quotes, t
7a10: 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20  hen.  ** Z is a 
7a20: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69  string literal i
7a30: 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  f it doesn't mat
7a40: 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61  ch any column na
7a50: 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  mes.  In that.  
7a60: 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64  ** case, we need
7a70: 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74   to return right
7a80: 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61   away and not ma
7a90: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  ke any changes t
7aa0: 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20  o.  ** pExpr..  
7ab0: 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20  **.  ** Because 
7ac0: 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
7ad0: 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63   made to outer c
7ae0: 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43  ontexts, the pNC
7af0: 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c  ->nRef.  ** fiel
7b00: 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67  ds are not chang
7b10: 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78  ed in any contex
7b20: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  t..  */.  if( cn
7b30: 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  t==0 && zTab==0 
7b40: 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d  && pColumnToken-
7b50: 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  >z[0]=='"' ){.  
7b60: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
7b70: 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  l);.    return 0
7b80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
7b90: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
7ba0: 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63  ere was not matc
7bb0: 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20  h.  cnt>1 means 
7bc0: 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f  there were two o
7bd0: 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63  r.  ** more matc
7be0: 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  hes.  Either way
7bf0: 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72  , we have an err
7c00: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  or..  */.  if( c
7c10: 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61  nt!=1 ){.    cha
7c20: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68  r *z = 0;.    ch
7c30: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45  ar *zErr;.    zE
7c40: 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e  rr = cnt==0 ? "n
7c50: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25  o such column: %
7c60: 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20  s" : "ambiguous 
7c70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
7c80: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b  ;.    if( zDb ){
7c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
7ca0: 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c  tString(&z, zDb,
7cb0: 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c   ".", zTab, ".",
7cc0: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d   zCol, 0);.    }
7cd0: 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b  else if( zTab ){
7ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
7cf0: 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54 61 62  tString(&z, zTab
7d00: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
7d10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7d20: 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 44    z = sqliteStrD
7d30: 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  up(zCol);.    }.
7d40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7d50: 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72  Msg(pParse, zErr
7d60: 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
7d70: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70 54 6f  Free(z);.    pTo
7d80: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  pNC->nErr++;.  }
7d90: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75  ..  /* If a colu
7da0: 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  mn from a table 
7db0: 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72  in pSrcList is r
7dc0: 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20  eferenced, then 
7dd0: 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73  record.  ** this
7de0: 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72   fact in the pSr
7df0: 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65  cList.a[].colUse
7e00: 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75  d bitmask.  Colu
7e10: 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a  mn 0 causes.  **
7e20: 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74   bit 0 to be set
7e30: 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73  .  Column 1 sets
7e40: 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20   bit 1.  And so 
7e50: 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20  forth.  If the. 
7e60: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   ** column numbe
7e70: 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
7e80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7e90: 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d  bits in the bitm
7ea0: 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65  ask.  ** then se
7eb0: 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72  t the high-order
7ec0: 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d   bit of the bitm
7ed0: 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask..  */.  if( 
7ee0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
7ef0: 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29  0 && pMatch!=0 )
7f00: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
7f10: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
7f20: 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28    if( n>=sizeof(
7f30: 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20  Bitmask)*8 ){.  
7f40: 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 42      n = sizeof(B
7f50: 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20 20 20  itmask)*8-1;.   
7f60: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
7f70: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d  Match->iCursor==
7f80: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
7f90: 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c  .    pMatch->col
7fa0: 55 73 65 64 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20  Used |= 1<<n;.  
7fb0: 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  }..lookupname_en
7fc0: 64 3a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  d:.  /* Clean up
7fd0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
7fe0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44  .  sqliteFree(zD
7ff0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
8000: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
8010: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
8020: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78  r->pLeft);.  pEx
8030: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
8040: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8050: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
8060: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
8070: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
8080: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
8090: 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f  .lookupname_end_
80a0: 32 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  2:.  sqliteFree(
80b0: 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e 74  zCol);.  if( cnt
80c0: 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==1 ){.    asser
80d0: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  t( pNC!=0 );.   
80e0: 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64   sqlite3AuthRead
80f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
8100: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a  pNC->pSrcList);.
8110: 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 26      if( pMatch &
8120: 26 20 21 70 4d 61 74 63 68 2d 3e 70 53 65 6c 65  & !pMatch->pSele
8130: 63 74 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  ct ){.      pExp
8140: 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61 74 63 68  r->pTab = pMatch
8150: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  ->pTab;.    }.  
8160: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
8170: 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e  he nRef value on
8180: 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78   all name contex
8190: 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70  ts from TopNC up
81a0: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   to.    ** the p
81b0: 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e  oint where the n
81c0: 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a  ame matched. */.
81d0: 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
81e0: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e     assert( pTopN
81f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  C!=0 );.      pT
8200: 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  opNC->nRef++;.  
8210: 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d      if( pTopNC==
8220: 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pNC ) break;.   
8230: 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70     pTopNC = pTop
8240: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  NC->pNext;.    }
8250: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8260: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
8270: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
8280: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8290: 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61 73  e is designed as
82a0: 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61   an xFunc for wa
82b0: 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a  lkExprTree()..**
82c0: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d 62  .** Resolve symb
82d0: 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20  olic names into 
82e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74  TK_COLUMN operat
82f0: 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  ors for the curr
8300: 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74  ent.** node in t
8310: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
8320: 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74 6f  ee.  Return 0 to
8330: 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65   continue the se
8340: 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65  arch down.** the
8350: 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61 62   tree or 2 to ab
8360: 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61 6c  ort the tree wal
8370: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
8380: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
8390: 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 61  error checking a
83a0: 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  nd name resoluti
83b0: 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69  on for.** functi
83c0: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f  on names.  The o
83d0: 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67 72  perator for aggr
83e0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
83f0: 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f  is changed.** to
8400: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
8410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8420: 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70  nameResolverStep
8430: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
8440: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d  r *pExpr){.  Nam
8450: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
8460: 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41  (NameContext*)pA
8470: 72 67 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rg;.  SrcList *p
8480: 53 72 63 4c 69 73 74 3b 0a 20 20 50 61 72 73 65  SrcList;.  Parse
8490: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28   *pParse;..  if(
84a0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
84b0: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
84c0: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 53 72 63  pNC!=0 );.  pSrc
84d0: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
84e0: 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 20 3d  List;.  pParse =
84f0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   pNC->pParse;.. 
8500: 20 69 66 28 20 45 78 70 72 48 61 73 41 6e 79 50   if( ExprHasAnyP
8510: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
8520: 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72 65  P_Resolved) ) re
8530: 74 75 72 6e 20 31 3b 0a 20 20 45 78 70 72 53 65  turn 1;.  ExprSe
8540: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
8550: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23   EP_Resolved);.#
8560: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
8570: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
8580: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
8590: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
85a0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
85b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
85c0: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
85d0: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
85e0: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
85f0: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
8600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
8610: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
8620: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  r->op ){.    /* 
8630: 44 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  Double-quoted st
8640: 72 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22  rings (ex: "abc"
8650: 29 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64  ) are used as id
8660: 65 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20  entifiers if.   
8670: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f   ** possible.  O
8680: 74 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65  therwise they re
8690: 6d 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e  main as strings.
86a0: 20 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a    Single-quoted.
86b0: 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28      ** strings (
86c0: 65 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61  ex: 'abc') are a
86d0: 6c 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74  lways string lit
86e0: 65 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  erals..    */.  
86f0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
8700: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
8710: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d  xpr->token.z[0]=
8720: 3d 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20  ='\'' ) break;. 
8730: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
8740: 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44  u into the TK_ID
8750: 20 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73   case if this is
8760: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
8770: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d   string */.    }
8780: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
8790: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
87a0: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
87b0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
87c0: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
87d0: 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61    lookupName(pPa
87e0: 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70  rse, 0, 0, &pExp
87f0: 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70  r->token, pNC, p
8800: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74  Expr);.      ret
8810: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  urn 1;.    }.  .
8820: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e      /* A table n
8830: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
8840: 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20  ame:     ID.ID. 
8850: 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62     ** Or a datab
8860: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
8870: 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44  olumn:  ID.ID.ID
8880: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8890: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
88a0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b   Token *pColumn;
88b0: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  .      Token *pT
88c0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65  able;.      Toke
88d0: 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78  n *pDb;.      Ex
88e0: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
88f0: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
8900: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
8910: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
8920: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
8930: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
8940: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
8950: 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a         pDb = 0;.
8960: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
8970: 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   &pExpr->pLeft->
8980: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70  token;.        p
8990: 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74  Column = &pRight
89a0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  ->token;.      }
89b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
89c0: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
89d0: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
89e0: 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70 72      pDb = &pExpr
89f0: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
8a00: 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d          pTable =
8a10: 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d   &pRight->pLeft-
8a20: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
8a30: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
8a40: 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  t->pRight->token
8a50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8a60: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
8a70: 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20  e, pDb, pTable, 
8a80: 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45  pColumn, pNC, pE
8a90: 78 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  xpr);.      retu
8aa0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
8ab0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63   /* Resolve func
8ac0: 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a  tion names.    *
8ad0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  /.    case TK_CO
8ae0: 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63 61  NST_FUNC:.    ca
8af0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
8b00: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
8b10: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
8b20: 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  >pList;    /* Th
8b30: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20  e argument list 
8b40: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
8b50: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
8b60: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
8b70: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8b80: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
8b90: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
8ba0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
8bb0: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
8bc0: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
8bd0: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
8be0: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
8bf0: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
8c00: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
8c10: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
8c20: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
8c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
8c40: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
8c50: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
8c60: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
8c70: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
8ca0: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
8cb0: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
8cc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
8cd0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
8ce0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
8cf0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
8d00: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
8d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
8d20: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
8d30: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
8d40: 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 70 50      int enc = pP
8d50: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 20 20  arse->db->enc;  
8d60: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
8d70: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20  encoding */..   
8d80: 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
8d90: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e  token.z;.      n
8da0: 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
8db0: 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  n.n;.      pDef 
8dc0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8dd0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
8de0: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65  , zId, nId, n, e
8df0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
8e00: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
8e10: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
8e20: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
8e30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
8e40: 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30   nId, -1, enc, 0
8e50: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
8e60: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
8e70: 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63      no_such_func
8e80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8e90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
8ea0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
8eb0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
8ec0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8ed0: 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d    is_agg = pDef-
8ee0: 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20  >xFunc==0;.     
8ef0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
8f00: 61 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c  agg && !pNC->all
8f10: 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  owAgg ){.       
8f20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8f30: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
8f40: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75   of aggregate fu
8f50: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20  nction %.*s()", 
8f60: 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20  nId,zId);.      
8f70: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
8f80: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
8f90: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
8fa0: 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  f( no_such_func 
8fb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8fc0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8fd0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
8fe0: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
8ff0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
9000: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
9010: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
9020: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
9030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9040: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77  rorMsg(pParse,"w
9050: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
9060: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
9070: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20  tion %.*s()",.  
9080: 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20             nId, 
9090: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
90a0: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
90b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
90c0: 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  agg ){.        p
90d0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
90e0: 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20  G_FUNCTION;.    
90f0: 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20      pNC->hasAgg 
9100: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
9110: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
9120: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
9130: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  0;.      for(i=0
9140: 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26  ; pNC->nErr==0 &
9150: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
9160: 20 20 20 20 20 77 61 6c 6b 45 78 70 72 54 72 65       walkExprTre
9170: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
9180: 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65  xpr, nameResolve
9190: 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20  rStep, pNC);.   
91a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
91b0: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
91c0: 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  owAgg = 1;.     
91d0: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d   /* FIX ME:  Com
91e0: 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69  pute pExpr->affi
91f0: 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68  nity based on th
9200: 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  e expected retur
9210: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20  n.      ** type 
9220: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
9230: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9240: 72 65 74 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20  return is_agg;. 
9250: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
9260: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9270: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
9280: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
9290: 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66  K_EXISTS:.#endif
92a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
92b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
92c0: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
92d0: 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20         int nRef 
92e0: 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20  = pNC->nRef;.   
92f0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
9300: 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
9310: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
9320: 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20 20 20  , pNC);.        
9330: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
9340: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
9350: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
9360: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
9370: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
9380: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
9390: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
93a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
93b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
93c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
93d0: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
93e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
93f0: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
9400: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
9410: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
9420: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
9430: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
9440: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
9450: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
9460: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
9470: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
9480: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a  n offset.  The .
9490: 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66  ** Expr.opcode f
94a0: 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73  or such nodes is
94b0: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
94c0: 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72  OLUMN.  The Expr
94d0: 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65  .iTable.** value
94e0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
94f0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
9500: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
9510: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20   in pTabList.** 
9520: 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20  plus the "base" 
9530: 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65  value.  The base
9540: 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69   value will ulti
9550: 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68  mately become th
9560: 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72  e.** VDBE cursor
9570: 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75   number for a cu
9580: 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
9590: 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72  nting into the r
95a0: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62  eferenced.** tab
95b0: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
95c0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63  olumn value is c
95d0: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
95e0: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
95f0: 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66  n .** of the ref
9600: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20  erenced table.  
9610: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
9620: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
9630: 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20  pecial.** ROWID 
9640: 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41  column is -1.  A
9650: 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ny INTEGER PRIMA
9660: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
9670: 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20   tried as an.** 
9680: 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e  alias for ROWID.
9690: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f  .**.** Also reso
96a0: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
96b0: 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65  es and check the
96c0: 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70   functions for p
96d0: 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20  roper.** usage. 
96e0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66   Make sure all f
96f0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72  unction names ar
9700: 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64  e recognized and
9710: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a   all functions.*
9720: 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65  * have the corre
9730: 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ct number of arg
9740: 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61  uments.  Leave a
9750: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
9760: 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ** in pParse->zE
9770: 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e  rrMsg if anythin
9780: 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74  g is amiss.  Ret
9790: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
97a0: 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
97b0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
97c0: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65  n contains aggre
97d0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  gate functions t
97e0: 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41  hen set the EP_A
97f0: 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f  gg.** property o
9800: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9810: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9820: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
9830: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
9840: 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e  *pNC,       /* N
9850: 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f  amespace to reso
9860: 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lve expressions 
9870: 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  in. */.  Expr *p
9880: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
9890: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
98a0: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
98b0: 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  d. */.){.  if( p
98c0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
98d0: 20 30 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   0;.  walkExprTr
98e0: 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  ee(pExpr, nameRe
98f0: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
9900: 3b 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72  ;.  if( pNC->nEr
9910: 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53  r>0 ){.    ExprS
9920: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
9930: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d  , EP_Error);.  }
9940: 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61  .  return ExprHa
9950: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9960: 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f   EP_Error);.}../
9970: 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 69  *.** A pointer i
9980: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
9990: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
99a0: 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d  d to pass inform
99b0: 61 74 69 6f 6e 0a 2a 2a 20 74 68 72 6f 75 67 68  ation.** through
99c0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 20 69 6e   walkExprTree in
99d0: 74 6f 20 63 6f 64 65 53 75 62 71 75 65 72 79 53  to codeSubqueryS
99e0: 74 65 70 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65  tep()..*/.typede
99f0: 66 20 73 74 72 75 63 74 20 51 75 65 72 79 43 6f  f struct QueryCo
9a00: 64 65 72 20 51 75 65 72 79 43 6f 64 65 72 3b 0a  der QueryCoder;.
9a10: 73 74 72 75 63 74 20 51 75 65 72 79 43 6f 64 65  struct QueryCode
9a20: 72 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  r {.  Parse *pPa
9a30: 72 73 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  rse;       /* Th
9a40: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
9a50: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
9a60: 78 74 20 2a 70 4e 43 3b 20 20 20 20 2f 2a 20 4e  xt *pNC;    /* N
9a70: 61 6d 65 73 70 61 63 65 20 6f 66 20 66 69 72 73  amespace of firs
9a80: 74 20 65 6e 63 6c 6f 73 69 6e 67 20 71 75 65 72  t enclosing quer
9a90: 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  y */.};.../*.** 
9aa0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
9ab0: 72 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  r subqueries and
9ac0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a   IN operators..*
9ad0: 2a 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72  *.** IN operator
9ae0: 73 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 20 66  s comes in two f
9af0: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  orms:.**.**     
9b00: 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65        expr IN (e
9b10: 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e 64 0a  xprlist).** and.
9b20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70  **           exp
9b30: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
9b40: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ).**.** The firs
9b50: 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64 6c 65  t form is handle
9b60: 64 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  d by creating a 
9b70: 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  set holding the 
9b80: 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77  list.** of allow
9b90: 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20  ed values.  The 
9ba0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61 75 73  second form caus
9bb0: 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 74 6f  es the SELECT to
9bc0: 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20 61 20   generate .** a 
9bd0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
9be0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
9bf0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9c00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
9c10: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
9c20: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
9c30: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 74 65  pExpr){.  int te
9c40: 73 74 41 64 64 72 20 3d 20 30 3b 20 20 20 20 20  stAddr = 0;     
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65    /* One-time te
9c70: 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  st address */.  
9c80: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9c90: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9ca0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
9cb0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 69  eturn;..  /* Thi
9cc0: 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72  s code must be r
9cd0: 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65  un in its entire
9ce0: 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74  ty every time it
9cf0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a   is encountered.
9d00: 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74    ** if any of t
9d10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
9d20: 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
9d30: 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d     *  The right-
9d40: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63  hand side is a c
9d50: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
9d60: 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68  ry.  **    *  Th
9d70: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
9d80: 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69  e is an expressi
9d90: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  on list containi
9da0: 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  ng variables.  *
9db0: 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69  *    *  We are i
9dc0: 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a  nside a trigger.
9dd0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c    **.  ** If all
9de0: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72   of the above ar
9df0: 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65  e false, then we
9e00: 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f   can run this co
9e10: 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a  de just once.  *
9e20: 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c  * save the resul
9e30: 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68  ts, and reuse th
9e40: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e  e same result on
9e50: 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f   subsequent invo
9e60: 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
9e70: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
9e80: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9e90: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20  P_VarSelect) && 
9ea0: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
9eb0: 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65  ck ){.    int me
9ec0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
9ed0: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
9ee0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
9ef0: 65 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b  emLoad, mem, 0);
9f00: 0a 20 20 20 20 74 65 73 74 41 64 64 72 20 3d 20  .    testAddr = 
9f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f20: 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 30 29  (v, OP_If, 0, 0)
9f30: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 65  ;.    assert( te
9f40: 73 74 41 64 64 72 3e 30 20 29 3b 0a 20 20 20 20  stAddr>0 );.    
9f50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f60: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9f70: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
9f80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9f90: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 6d 65 6d 2c  P_MemStore, mem,
9fa0: 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   1);.  }..  if( 
9fb0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
9fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9fd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
9fe0: 43 6f 6e 74 65 78 74 50 75 73 68 2c 20 30 2c 20  ContextPush, 0, 
9ff0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  0);.  }..  switc
a000: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
a010: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
a020: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
a030: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79  inity;.      Key
a040: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
a050: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
a060: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
a070: 6f 66 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  of OP_OpenVirtua
a080: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
a090: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
a0a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
a0b0: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
a0c0: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
a0d0: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
a0e0: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
a0f0: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
a100: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
a110: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
a120: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
a130: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
a140: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 73  virtual table is
a150: 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65   .      ** fille
a160: 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69  d with single-fi
a170: 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72  eld index keys r
a180: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
a190: 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
a1a0: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
a1b0: 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73   or the <exprlis
a1c0: 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  t>..      **.   
a1d0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27     ** If the 'x'
a1e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
a1f0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f   column value, o
a200: 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a  r the SELECT....
a210: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
a220: 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c  nt returns a col
a230: 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  umn value, then 
a240: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
a250: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  that.      ** co
a260: 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20  lumn is used to 
a270: 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20  build the index 
a280: 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78  keys. If both 'x
a290: 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  ' and the.      
a2a0: 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  ** SELECT... sta
a2b0: 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
a2c0: 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
a2d0: 20 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65   affinity is use
a2e0: 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69  d.      ** if ei
a2f0: 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ther column has 
a300: 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47  NUMERIC or INTEG
a310: 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20  ER affinity. If 
a320: 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  neither.      **
a330: 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c   'x' nor the SEL
a340: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
a350: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
a360: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
a370: 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ity.      ** is 
a380: 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  used..      */. 
a390: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
a3a0: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  le = pParse->nTa
a3b0: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20  b++;.      addr 
a3c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
a3d0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
a3e0: 74 75 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61  tual, pExpr->iTa
a3f0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d  ble, 0);.      m
a400: 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20  emset(&keyInfo, 
a410: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66  0, sizeof(keyInf
a420: 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e  o));.      keyIn
a430: 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20  fo.nField = 1;. 
a440: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a450: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
a460: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72  umColumns, pExpr
a470: 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20  ->iTable, 1);.. 
a480: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
a490: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
a4a0: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
a4b0: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
a4c0: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
a4d0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
a4e0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
a4f0: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
a500: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
a510: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
a520: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
a530: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
a540: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
a550: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a560: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78   int iParm = pEx
a570: 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28  pr->iTable +  ((
a580: 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c  (int)affinity)<<
a590: 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  16);.        Exp
a5a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
a5b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
a5c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78  pExpr->iTable&0x
a5d0: 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72  0000FFFF)==pExpr
a5e0: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
a5f0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
a600: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
a610: 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65  >pSelect, SRT_Se
a620: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
a630: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  0, 0);.        p
a640: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
a650: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
a660: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
a670: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
a680: 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20  xpr>0 ){ .      
a690: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
a6a0: 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f 6d  l[0] = binaryCom
a6b0: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
a6c0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
a6d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a6e0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
a6f0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
a700: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
a710: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
a720: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
a730: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
a740: 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
a750: 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68   **..** For each
a760: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
a770: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
a780: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
a790: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
a7a0: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
a7b0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
a7c0: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
a7d0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
a7e0: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
a7f0: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
a800: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
a810: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
a820: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
a830: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
a840: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
a850: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
a860: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
a870: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
a880: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
a890: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
a8a0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
a8b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
a8c0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
a8d0: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
a8e0: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
a8f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
a900: 52 49 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  RIC;.        }. 
a910: 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61         keyInfo.a
a920: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d  Coll[0] = pExpr-
a930: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a  >pLeft->pColl;..
a940: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a950: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
a960: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
a970: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
a980: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
a990: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
a9a0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
a9b0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
a9c0: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
a9d0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20  pItem->pExpr;.. 
a9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
a9f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
aa00: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68   not constant th
aa10: 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  en we will need 
aa20: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
aa30: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74  disable the test
aa40: 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61   that was genera
aa50: 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d  ted above that m
aa60: 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20  akes sure.      
aa70: 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
aa80: 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f   only executes o
aa90: 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f  nce.  Because fo
aaa0: 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74  r a non-constant
aab0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
aac0: 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64  pression we need
aad0: 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63   to rerun this c
aae0: 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20  ode each time.. 
aaf0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ab00: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 41 64        if( testAd
ab10: 64 72 3e 30 20 26 26 20 21 73 71 6c 69 74 65 33  dr>0 && !sqlite3
ab20: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
ab30: 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
ab40: 20 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d     VdbeOp *aOp =
ab50: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
ab60: 70 28 76 2c 20 74 65 73 74 41 64 64 72 2d 31 29  p(v, testAddr-1)
ab70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
ab80: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t i;.           
ab90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69   for(i=0; i<4; i
aba0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
abb0: 20 20 20 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65     aOp[i].opcode
abc0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
abd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
abe0: 20 20 20 20 20 20 74 65 73 74 41 64 64 72 20 3d        testAddr =
abf0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
ac00: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
ac10: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
ac20: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
ac30: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
ac40: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
ac50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ac60: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
ac70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ac80: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ac90: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
aca0: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
acb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
acc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
acd0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
ace0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
acf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ad00: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
ad10: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
ad20: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
ad30: 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
ad40: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61  NFO);.      brea
ad50: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
ad60: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
ad70: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
ad80: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
ad90: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
ada0: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
adb0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
adc0: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
add0: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
ade0: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
adf0: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
ae00: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
ae10: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
ae20: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
ae30: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
ae40: 20 20 20 69 6e 74 20 73 6f 70 3b 0a 20 20 20 20     int sop;.    
ae50: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
ae60: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
ae70: 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e  olumn = pParse->
ae80: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53  nMem++;.      pS
ae90: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  el = pExpr->pSel
aea0: 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ect;.      if( p
aeb0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
aec0: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ECT ){.        s
aed0: 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  op = SRT_Mem;.  
aee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aef0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
af00: 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31  Token one = { "1
af10: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
af20: 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69     sop = SRT_Exi
af30: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
af40: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
af50: 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29  te(pSel->pEList)
af60: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e  ;.        pSel->
af70: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
af80: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
af90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
afb0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45  ite3Expr(TK_INTE
afc0: 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29  GER, 0, 0, &one)
afd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
afe0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
aff0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
b000: 73 6f 70 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  sop, pExpr->iCol
b010: 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  umn, 0, 0, 0, 0)
b020: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b030: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
b040: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
b050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b060: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
b070: 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30  ContextPop, 0, 0
b080: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 65 73  );.  }.  if( tes
b090: 74 41 64 64 72 20 29 7b 0a 20 20 20 20 73 71 6c  tAddr ){.    sql
b0a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
b0b0: 28 76 2c 20 74 65 73 74 41 64 64 72 2c 20 73 71  (v, testAddr, sq
b0c0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
b0d0: 41 64 64 72 28 76 29 29 3b 0a 20 20 7d 0a 20 20  Addr(v));.  }.  
b0e0: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
b0f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b100: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
b110: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
b120: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
b130: 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
b140: 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
b150: 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
b160: 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  1] on the stack.
b170: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b180: 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62 65  codeInteger(Vdbe
b190: 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
b1a0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
b1b0: 74 20 69 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  t i;.  if( sqlit
b1c0: 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69  e3GetInt32(z, &i
b1d0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b1e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b1f0: 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a  Integer, i, 0);.
b200: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
b210: 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28  te3FitsIn64Bits(
b220: 7a 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  z) ){.    sqlite
b230: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49  3VdbeOp3(v, OP_I
b240: 6e 74 36 34 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e  nt64, 0, 0, z, n
b250: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b260: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
b270: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c  , OP_Real, 0, 0,
b280: 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   z, n);.  }.}../
b290: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
b2a0: 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
b2b0: 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
b2c0: 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
b2d0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
b2e0: 20 6c 65 61 76 65 20 74 68 65 20 72 65 73 75 6c   leave the resul
b2f0: 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  t on the top of 
b300: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stack..**.** Thi
b310: 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
b320: 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
b330: 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61  certain token va
b340: 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29  lues (ex: TK_EQ)
b350: 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65  .** are the same
b360: 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65   as opcode value
b370: 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68  s (ex: OP_Eq) th
b380: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  at implement the
b390: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
b3a0: 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70  * operation.  Sp
b3b0: 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69  ecial comments i
b3c0: 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65  n vdbe.c and the
b3d0: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73   mkopcodeh.awk s
b3e0: 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20  cript in.** the 
b3f0: 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75  make process cau
b400: 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  se these values 
b410: 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72  to align.  Asser
b420: 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65  t()s in the code
b430: 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79  .** below verify
b440: 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
b450: 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f  s are aligned co
b460: 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rrectly..*/.void
b470: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b480: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b490: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
b4a0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
b4b0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
b4c0: 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  p;.  if( v==0 ) 
b4d0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
b4e0: 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  xpr==0 ){.    sq
b4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b500: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
b510: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b520: 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  }.  op = pExpr->
b530: 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
b540: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b550: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
b560: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 66 69 6c  if( !pParse->fil
b570: 6c 41 67 67 20 26 26 20 70 45 78 70 72 2d 3e 69  lAgg && pExpr->i
b580: 41 67 67 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Agg>=0 ){.      
b590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b5a0: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
b5b0: 20 70 45 78 70 72 2d 3e 69 41 67 67 43 74 78 2c   pExpr->iAggCtx,
b5c0: 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20   pExpr->iAgg);. 
b5d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
b5e0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
b5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b600: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b610: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  OP_Column, pExpr
b620: 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
b630: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
b640: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
b650: 44 65 66 61 75 6c 74 28 76 2c 20 70 45 78 70 72  Default(v, pExpr
b660: 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  ->pTab, pExpr->i
b670: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
b680: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b6a0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 45 78 70  , OP_Rowid, pExp
b6b0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
b6c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
b6d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b6e0: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
b6f0: 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
b700: 65 72 28 76 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  er(v, pExpr->tok
b710: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
b720: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
b730: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b740: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
b750: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
b760: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
b770: 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65   TK_FLOAT==OP_Re
b780: 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  al );.      asse
b790: 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f  rt( TK_STRING==O
b7a0: 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20  P_String8 );.   
b7b0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
b7c0: 65 45 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20  eExpr(pExpr);.  
b7d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
b7e0: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
b7f0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
b800: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
b810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b820: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b830: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
b840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b850: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
b860: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b870: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
b880: 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
b890: 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
b8a0: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
b8b0: 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d  assert( TK_BLOB=
b8c0: 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20  =OP_HexBlob );. 
b8d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b8e0: 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c  Op3(v, op, 0, 0,
b8f0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b   pExpr->token.z+
b900: 32 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  2, pExpr->token.
b910: 6e 2d 33 29 3b 0a 20 20 20 20 20 20 62 72 65 61  n-3);.      brea
b920: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b930: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
b940: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
b950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b960: 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70  , OP_Variable, p
b970: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
b980: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
b990: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a  r->token.n>1 ){.
b9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b9b0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
b9c0: 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  1, pExpr->token.
b9d0: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
b9e0: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
b9f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ba00: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
ba10: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
ba20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ba30: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78   OP_MemLoad, pEx
ba40: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
ba50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba60: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
ba70: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
ba80: 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
ba90: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
baa0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
bab0: 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
bac0: 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
bad0: 20 20 69 6e 74 20 61 66 66 2c 20 6f 70 3b 0a 20    int aff, op;. 
bae0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
baf0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
bb00: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
bb10: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 41    aff = sqlite3A
bb20: 66 66 69 6e 69 74 79 54 79 70 65 28 26 70 45 78  ffinityType(&pEx
bb30: 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pr->token);.    
bb40: 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29 7b    switch( aff ){
bb50: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
bb60: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
bb70: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 54 6f 49 6e  :   op = OP_ToIn
bb80: 74 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  t;      break;. 
bb90: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
bba0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20  TE_AFF_NUMERIC: 
bbb0: 20 20 6f 70 20 3d 20 4f 50 5f 54 6f 4e 75 6d 65    op = OP_ToNume
bbc0: 72 69 63 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ric;  break;.   
bbd0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bbe0: 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20 20 20  _AFF_TEXT:      
bbf0: 6f 70 20 3d 20 4f 50 5f 54 6f 54 65 78 74 3b 20  op = OP_ToText; 
bc00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bc10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
bc20: 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 20 20 6f 70  FF_NONE:      op
bc30: 20 3d 20 4f 50 5f 54 6f 42 6c 6f 62 3b 20 20 20   = OP_ToBlob;   
bc40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
bc50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bc60: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
bc70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
bc80: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
bc90: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
bca0: 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
bcb0: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
bcc0: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
bcd0: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
bce0: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
bcf0: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
bd00: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
bd10: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
bd20: 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
bd30: 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
bd40: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
bd50: 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
bd60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bd70: 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
bd80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
bd90: 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
bda0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
bdb0: 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
bdc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
bdd0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
bde0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
bdf0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
be00: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
be10: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
be20: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
be30: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
be40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
be50: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
be60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
be70: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
be80: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
be90: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
bea0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
beb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
bec0: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
bed0: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
bee0: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
bef0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
bf00: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
bf10: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
bf20: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
bf30: 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
bf40: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
bf50: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
bf60: 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
bf70: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
bf80: 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
bf90: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
bfa0: 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
bfb0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
bfc0: 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
bfd0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
bfe0: 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
bff0: 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
c000: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
c010: 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
c020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
c030: 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
c040: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
c050: 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
c060: 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
c070: 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
c080: 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
c090: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c0a0: 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
c0b0: 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
c0c0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
c0d0: 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
c0e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c0f0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c100: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
c110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c120: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c130: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
c140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c150: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
c160: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c170: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c180: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
c190: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
c1a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
c1b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
c1c0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
c1d0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
c1e0: 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d  AT || pLeft->op=
c1f0: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
c200: 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20         Token *p 
c210: 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  = &pLeft->token;
c220: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
c230: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
c240: 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20   p->n + 2 );.   
c250: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20       sprintf(z, 
c260: 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70  "-%.*s", p->n, p
c270: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ->z);.        if
c280: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
c290: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
c2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c2b0: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
c2c0: 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a   0, z, p->n+1);.
c2d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c2e0: 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74           codeInt
c2f0: 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b  eger(v, z, p->n+
c300: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
c310: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
c320: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  (z);.        bre
c330: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c340: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
c350: 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f  h into TK_NOT */
c360: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c370: 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
c380: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
c390: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
c3a0: 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
c3b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c3c0: 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
c3d0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
c3e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c3f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
c400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c410: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
c420: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
c430: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c440: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
c450: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
c460: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
c470: 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
c480: 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
c490: 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
c4a0: 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
c4b0: 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
c4c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c4d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c4e0: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20  nteger, 1, 0);. 
c4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c500: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c510: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c520: 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33    dest = sqlite3
c530: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
c540: 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71  v) + 2;.      sq
c550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c560: 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
c570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c580: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
c590: 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20  Imm, -1, 0);.   
c5a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c5b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
c5c0: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
c5d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c5e0: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
c5f0: 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29   0, pExpr->iAgg)
c600: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c610: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c620: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
c630: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
c640: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
c650: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
c660: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
c670: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
c680: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
c690: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
c6a0: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
c6b0: 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
c6c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
c6d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  ;.      int p2 =
c6e0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
c6f0: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
c700: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
c710: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
c720: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
c730: 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   zId = pExpr->to
c740: 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64  ken.z;.      nId
c750: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
c760: 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
c770: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
c780: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
c790: 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
c7a0: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
c7b0: 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
c7c0: 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  );.      nExpr =
c7d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c7e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
c7f0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66   pList);.      f
c800: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
c810: 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
c820: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
c830: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
c840: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
c850: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
c860: 20 70 32 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20   p2 |= (1<<i);. 
c870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c880: 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
c890: 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c  ollSeq && !pColl
c8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
c8b0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
c8c0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
c8d0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
c8e0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
c8f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c900: 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
c910: 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  eq ){.        if
c920: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
c930: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
c940: 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
c950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c960: 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
c970: 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
c980: 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
c990: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c9b0: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
c9c0: 6e 45 78 70 72 2c 20 70 32 2c 20 28 63 68 61 72  nExpr, p2, (char
c9d0: 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44  *)pDef, P3_FUNCD
c9e0: 45 46 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  EF);.      break
c9f0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
ca00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
ca10: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
ca20: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
ca30: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
ca40: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
ca50: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
ca60: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
ca70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ca80: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
ca90: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
caa0: 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
cab0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61  mment((v, "# loa
cac0: 64 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  d subquery resul
cad0: 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  t"));.      brea
cae0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
caf0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
cb00: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
cb10: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
cb20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
cb30: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
cb40: 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  e, pExpr);..    
cb50: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
cb60: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
cb70: 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
cb80: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
cb90: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
cba0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
cbb0: 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
cbc0: 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
cbd0: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
cbe0: 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20  .      ** P3 of 
cbf0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
cc00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
cc10: 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
cc20: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
cc30: 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  r);..      sqlit
cc40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cc50: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
cc60: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
cc70: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
cc80: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
cc90: 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72  )". The temporar
cca0: 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  y table.      **
ccb0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63   pExpr->iTable c
ccc0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
ccd0: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
cce0: 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20  the (...) set.. 
ccf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
cd00: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
cd10: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
cd20: 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ft);.      addr 
cd30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
cd40: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
cd50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cd60: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
cd70: 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20  l, -1, addr+4); 
cd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
cd90: 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20  dr + 0 */.      
cda0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cdb0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
cdc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cdd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cde0: 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
cdf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce00: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
ce10: 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20  0, addr+7);.    
ce20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ce30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
ce40: 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69  d, 1, 0, &affini
ce50: 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64  ty, 1);   /* add
ce60: 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73  r + 4 */.      s
ce70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ce80: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
ce90: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72  pr->iTable, addr
cea0: 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +7);.      sqlit
ceb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cec0: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
ced0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cee0: 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a     /* addr + 6 *
cef0: 2f 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  /..      break;.
cf00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
cf10: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
cf20: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
cf30: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
cf40: 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
cf50: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
cf60: 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
cf70: 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  ->pList->a;.    
cf80: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
cf90: 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
cfa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cfb0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
cfc0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
cfd0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cfe0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
cff0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d000: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
d010: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
d020: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
d030: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
d040: 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Ge, 0, 0);.   
d050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d060: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
d070: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49  1, 0);.      pLI
d080: 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
d090: 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
d0a0: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
d0b0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d0c0: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
d0d0: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
d0e0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
d0f0: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30  ght, OP_Le, 0, 0
d100: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d110: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d120: 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  And, 0, 0);.    
d130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d140: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
d150: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  :.    case TK_AS
d160: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
d170: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d180: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
d190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d1a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
d1b0: 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
d1c0: 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  t expr_end_label
d1d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70  ;.      int jump
d1e0: 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Inst;.      int 
d1f0: 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  addr;.      int 
d200: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
d210: 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   i;.      ExprLi
d220: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
d230: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
d240: 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
d250: 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  m;..      assert
d260: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  (pExpr->pList);.
d270: 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
d280: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
d290: 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
d2a0: 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
d2b0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  ->pList->nExpr >
d2c0: 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
d2d0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
d2e0: 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
d2f0: 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
d300: 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
d310: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
d320: 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c    expr_end_label
d330: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d340: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d350: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
d360: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
d370: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d380: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d390: 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ft);.      }.   
d3a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
d3b0: 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
d3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d3d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
d3e0: 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29  stelem[i].pExpr)
d3f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
d400: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
d410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d420: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
d430: 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  up, 1, 1);.     
d440: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
d450: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
d460: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d470: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
d480: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c         OP_Ne, 0,
d4b0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
d4c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d4d0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
d4e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
d500: 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
d510: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
d520: 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 1, 0);.     
d530: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
d540: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d550: 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
d560: 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +1].pExpr);.    
d570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d580: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
d590: 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
d5a0: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  el);.        add
d5b0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
d5c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
d5d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d5e0: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75  beChangeP2(v, ju
d5f0: 6d 70 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20  mpInst, addr);. 
d600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d610: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
d620: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d630: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d640: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
d650: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
d660: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
d670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
d680: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d690: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
d6a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d6b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d6c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
d6d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
d6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6f0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d700: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
d710: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d720: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
d730: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
d740: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
d750: 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  SE: {.      if( 
d760: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
d770: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
d780: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d790: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41               "RA
d7b0: 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ISE() may only b
d7c0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  e used within a 
d7d0: 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22  trigger-program"
d7e0: 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20  );..return;.    
d7f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
d800: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45  xpr->iColumn!=OE
d810: 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20  _Ignore ){.     
d820: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
d830: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52  r->iColumn==OE_R
d840: 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20  ollback ||.     
d850: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
d860: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
d870: 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20  _Abort ||.      
d880: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
d890: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
d8a0: 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Fail );.        
d8b0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 45   sqlite3DequoteE
d8c0: 78 70 72 28 70 45 78 70 72 29 3b 0a 20 20 20 20  xpr(pExpr);.    
d8d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d8e0: 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op3(v, OP_Halt, 
d8f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
d900: 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  T, pExpr->iColum
d910: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d920: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
d930: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
d940: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 2f 2f 20 20  ->token.n);.//  
d950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d960: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
d970: 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
d980: 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
d990: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
d9a0: 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20  mn == OE_Ignore 
d9b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
d9c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d9d0: 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
d9e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73  , 0);.         s
d9f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
da00: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
da10: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
da20: 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20  ->ignoreJump);. 
da30: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
da40: 65 6e 74 28 28 76 2c 20 22 23 20 72 61 69 73 65  ent((v, "# raise
da50: 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20  (IGNORE)"));.   
da60: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
da70: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
da80: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
da90: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
daa0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
dab0: 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
dac0: 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
dad0: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
dae0: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
daf0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  on the stack.  S
db00: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 45  ee also sqlite3E
db10: 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprCode()..**.**
db20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
db30: 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20 74  ght also cache t
db40: 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f  he result and mo
db50: 64 69 66 79 20 74 68 65 20 70 45 78 70 72 20 74  dify the pExpr t
db60: 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ree.** so that i
db70: 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20  t will make use 
db80: 6f 66 20 74 68 65 20 63 61 63 68 65 64 20 72 65  of the cached re
db90: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
dba0: 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a  nt evaluations.*
dbb0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76  * rather than ev
dbc0: 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c 65  aluate the whole
dbd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
dbe0: 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70 72  n.  Trivial expr
dbf0: 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e  essions are.** n
dc00: 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66 20 74  ot cached.  If t
dc10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
dc20: 20 63 61 63 68 65 64 2c 20 69 74 73 20 72 65 73   cached, its res
dc30: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
dc40: 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f   a .** memory lo
dc50: 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  cation..*/.void 
dc60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
dc70: 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
dc80: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
dc90: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
dca0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
dcb0: 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e    int iMem;.  in
dcc0: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
dcd0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
dce0: 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  urn;.  addr1 = s
dcf0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
dd00: 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69  tAddr(v);.  sqli
dd10: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
dd20: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 61 64  se, pExpr);.  ad
dd30: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
dd40: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
dd50: 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64 64  .  if( addr2>add
dd60: 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33 56  r1+1 || sqlite3V
dd70: 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72  dbeGetOp(v, addr
dd80: 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  1)->opcode==OP_F
dd90: 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  unction ){.    i
dda0: 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Mem = pExpr->iTa
ddb0: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ble = pParse->nM
ddc0: 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  em++;.    sqlite
ddd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
dde0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
ddf0: 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e   0);.    pExpr->
de00: 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
de10: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
de20: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
de30: 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
de40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
de50: 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
de60: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
de70: 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20  ssion list onto 
de80: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
de90: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
dea0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70  er of elements p
deb0: 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73  ushed onto the s
dec0: 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tack..*/.int sql
ded0: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
dee0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
def0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
df00: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
df10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
df20: 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st    /* The exp
df30: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
df40: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  be coded */.){. 
df50: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
df60: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
df70: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 66 28 20  int i, n;.  if( 
df80: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
df90: 6e 20 30 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74  n 0;.  n = pList
dfa0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
dfb0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
dfc0: 3d 6e 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  =n; i>0; i--, pI
dfd0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
dfe0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
dff0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
e000: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e010: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
e020: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
e030: 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
e040: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
e050: 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
e060: 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
e070: 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
e080: 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
e090: 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
e0a0: 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
e0b0: 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
e0c0: 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
e0d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
e0e0: 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
e0f0: 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
e100: 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
e110: 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
e120: 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
e130: 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
e140: 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
e150: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
e160: 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
e170: 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
e180: 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
e190: 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
e1a0: 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
e1b0: 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
e1c0: 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
e1d0: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
e1e0: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
e1f0: 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
e200: 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
e210: 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
e220: 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
e230: 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
e240: 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
e250: 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
e260: 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
e270: 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
e280: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
e290: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
e2a0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
e2b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e2c0: 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
e2d0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
e2e0: 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
e2f0: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
e300: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
e310: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
e320: 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d  op = 0;.  if( v=
e330: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
e340: 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20   return;.  op = 
e350: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
e360: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
e370: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
e380: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
e390: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
e3a0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
e3b0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
e3c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e3d0: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
e3e0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
e3f0: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
e400: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
e410: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
e420: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
e430: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e440: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
e450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e460: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
e470: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e480: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
e490: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e4a0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
e4b0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
e4c0: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
e4d0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
e4e0: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
e4f0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
e500: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e510: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
e520: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
e530: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
e540: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
e550: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
e560: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e570: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
e580: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
e590: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
e5a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
e5b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
e5c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
e5d0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
e5e0: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
e5f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
e600: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
e610: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
e620: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
e630: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
e640: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
e650: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
e660: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
e670: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
e680: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
e690: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e6a0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
e6b0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
e6c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e6d0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
e6e0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
e6f0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
e700: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
e710: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65  ->pRight, op, de
e720: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
e730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e740: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e750: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
e760: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
e770: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
e780: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
e790: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
e7a0: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
e7b0: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
e7c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e7d0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
e7e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
e7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e800: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
e810: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e820: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
e830: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
e840: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e850: 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ion "x BETWEEN y
e860: 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65   AND z" is imple
e870: 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
e880: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
e890: 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33  F (x < y) GOTO 3
e8a0: 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28  .      ** 2 IF (
e8b0: 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65  x <= z) GOTO <de
e8c0: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e  st>.      ** 3 .
e8d0: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
e8e0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
e8f0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
e900: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
e910: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
e920: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
e930: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
e940: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e950: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
e960: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e970: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e980: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
e990: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e9a0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
e9b0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
e9c0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
e9d0: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
e9e0: 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75  t, OP_Lt, 0, !ju
e9f0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
ea00: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
ea10: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
ea20: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
ea30: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ea40: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
ea50: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
ea60: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
ea70: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74  ght, OP_Le, dest
ea80: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a  , jumpIfNull);..
ea90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eaa0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
eab0: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
eac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ead0: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
eae0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
eaf0: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
eb00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eb10: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
eb20: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
eb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
eb40: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
eb50: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
eb60: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
eb70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eb80: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75  dOp(v, OP_If, ju
eb90: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
eba0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ebb0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ebc0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
ebd0: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
ebe0: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
ebf0: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
ec00: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
ec10: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
ec20: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
ec30: 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
ec40: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
ec50: 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
ec60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ec70: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
ec80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
ec90: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
eca0: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
ecb0: 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
ecc0: 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
ecd0: 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20  Null is true or 
ece0: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
ecf0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61  jumpIfNull is fa
ed00: 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lse..*/.void sql
ed10: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
ed20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
ed30: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
ed40: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
ed50: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
ed60: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ed70: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
ed80: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
ed90: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
eda0: 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
edb0: 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
edc0: 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
edd0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
ede0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
edf0: 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
ee00: 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
ee10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
ee20: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
ee30: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
ee40: 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
ee50: 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
ee60: 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
ee70: 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
ee80: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
eea0: 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
eeb0: 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
eec0: 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
eed0: 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
eee0: 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
eef0: 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
ef00: 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
ef10: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
ef30: 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
ef40: 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
ef50: 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
ef60: 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
ef70: 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
ef80: 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
ef90: 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
efa0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
efb0: 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
efc0: 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
efd0: 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
efe0: 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
eff0: 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
f000: 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
f010: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
f020: 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
f030: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
f040: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
f050: 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
f060: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
f070: 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
f080: 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
f090: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
f0a0: 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
f0b0: 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
f0c0: 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
f0d0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
f0e0: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
f0f0: 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
f100: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
f110: 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
f120: 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
f130: 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
f140: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
f150: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
f160: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
f170: 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
f180: 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
f190: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
f1a0: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
f1b0: 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
f1c0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
f1d0: 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
f1e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
f1f0: 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
f200: 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
f210: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
f220: 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
f230: 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
f240: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
f250: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
f260: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f270: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
f280: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f290: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
f2a0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
f2b0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
f2c0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
f2d0: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
f2e0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
f2f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f300: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
f310: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
f320: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f330: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
f340: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
f350: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
f360: 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75  t, d2, !jumpIfNu
f370: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
f380: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
f390: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
f3a0: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
f3b0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
f3c0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f3d0: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
f3e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f3f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
f400: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f410: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
f420: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f430: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
f440: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
f450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f460: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
f470: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
f480: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
f490: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
f4a0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
f4b0: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
f4c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f4d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f4e0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
f4f0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f500: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
f510: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
f520: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
f530: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
f540: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20  pr->pRight, op, 
f550: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
f560: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f570: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
f580: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
f590: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
f5a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f5b0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f5c0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
f5d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f5e0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
f5f0: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
f600: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f610: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
f620: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
f630: 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45  ression is "x BE
f640: 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20  TWEEN y AND z". 
f650: 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  It is implemente
f660: 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
f670: 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20       ** 1 IF (x 
f680: 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20  >= y) GOTO 3.   
f690: 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65     ** 2 GOTO <de
f6a0: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49  st>.      ** 3 I
f6b0: 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c  F (x > z) GOTO <
f6c0: 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20  dest>.      */. 
f6d0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
f6e0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
f6f0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
f700: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
f710: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
f720: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
f730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f740: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
f750: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
f760: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f770: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
f780: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f790: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
f7a0: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  ght);.      addr
f7b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
f7c0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
f7d0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
f7e0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
f7f0: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64  Right, OP_Ge, ad
f800: 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  dr+3, !jumpIfNul
f810: 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  l);..      sqlit
f820: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f830: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
f840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f850: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
f860: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
f870: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
f880: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
f890: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
f8a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f8b0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
f8c0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
f8d0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
f8e0: 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c  ht, OP_Gt, dest,
f8f0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
f900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f910: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f930: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
f940: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
f950: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f960: 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66  OP_IfNot, jumpIf
f970: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
f980: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f990: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20    }.}../*.** Do 
f9a0: 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
f9b0: 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
f9c0: 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
f9d0: 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
f9e0: 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
f9f0: 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
fa00: 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
fa10: 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
fa20: 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ny way..*/.int s
fa30: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
fa40: 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
fa50: 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
fa60: 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20    if( pA==0 ){. 
fa70: 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b     return pB==0;
fa80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d  .  }else if( pB=
fa90: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
faa0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
fab0: 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72  ->op!=pB->op ) r
fac0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
fad0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
fae0: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
faf0: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
fb00: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
fb10: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
fb20: 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
fb30: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
fb40: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  0;.  if( pA->pLi
fb50: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  st ){.    if( pB
fb60: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ->pList==0 ) ret
fb70: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
fb80: 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  A->pList->nExpr!
fb90: 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  =pB->pList->nExp
fba0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
fbb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
fbc0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
fbd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
fbe0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
fbf0: 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b  re(pA->pList->a[
fc00: 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c  i].pExpr, pB->pL
fc10: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
fc20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fc30: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
fc40: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
fc50: 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pB->pList ){.   
fc60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
fc70: 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74   if( pA->pSelect
fc80: 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20   || pB->pSelect 
fc90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
fca0: 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
fcb0: 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
fcc0: 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
fcd0: 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  lumn ) return 0;
fce0: 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e  .  if( pA->token
fcf0: 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
fd00: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
fd10: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
fd20: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
fd30: 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
fd40: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
fd50: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 41  lite3StrNICmp(pA
fd60: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74  ->token.z, pB->t
fd70: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
fd80: 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  n.n)!=0 ) return
fd90: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
fda0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   1;.}../*.** Add
fdb0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
fdc0: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
fdd0: 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72  gg[] array and r
fde0: 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e  eturn its index.
fdf0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6c 65 6d  .** The new elem
fe00: 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ent is initializ
fe10: 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  ed to zero.  The
fe20: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
fe30: 6e 20 69 73 0a 2a 2a 20 65 78 70 65 63 74 65 64  n is.** expected
fe40: 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
fe50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
fe60: 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73  pendAggInfo(Pars
fe70: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
fe80: 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  ( (pParse->nAgg 
fe90: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
fea0: 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73   int amt = pPars
feb0: 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20  e->nAgg + 8;.   
fec0: 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d   AggExpr *aAgg =
fed0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
fee0: 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74  Parse->aAgg, amt
fef0: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
ff00: 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aAgg[0]));.    i
ff10: 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20  f( aAgg==0 ){.  
ff20: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
ff30: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
ff40: 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20  >aAgg = aAgg;.  
ff50: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72  }.  memset(&pPar
ff60: 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d  se->aAgg[pParse-
ff70: 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nAgg], 0, sizeo
ff80: 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30  f(pParse->aAgg[0
ff90: 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ]));.  return pP
ffa0: 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a  arse->nAgg++;.}.
ffb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
ffc0: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
ffd0: 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20  ExprTree() used 
ffe0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a  to implement .**
fff0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
10000 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
10010 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
10020 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
10030 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
10040 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
10050 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10060 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68  tine analyzes th
10070 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
10080 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a  tion at pExpr..*
10090 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
100a0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f  lyzeAggregate(vo
100b0 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
100c0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
100d0 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67  .  AggExpr *aAgg
100e0 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
100f0 2a 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74  *pNC = (NameCont
10100 65 78 74 20 2a 29 70 41 72 67 3b 0a 20 20 50 61  ext *)pArg;.  Pa
10110 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
10120 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 53 72 63  C->pParse;.  Src
10130 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
10140 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
10150 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
10160 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
10170 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
10180 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 53 72      for(i=0; pSr
10190 63 4c 69 73 74 20 26 26 20 69 3c 70 53 72 63 4c  cList && i<pSrcL
101a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
101b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
101c0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
101d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
101e0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
101f0 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
10200 41 67 67 3b 0a 20 20 20 20 20 20 20 20 20 20 66  Agg;.          f
10210 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
10220 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
10230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 41            if( aA
10240 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f  gg[i].isAgg ) co
10250 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
10260 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
10270 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
10280 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
10290 20 20 20 20 20 20 20 20 20 20 26 26 20 61 41 67            && aAg
102a0 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c  g[i].pExpr->iCol
102b0 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c  umn==pExpr->iCol
102c0 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
102d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
102e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
102f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10300 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
10310 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Agg ){.         
10320 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67     i = appendAgg
10330 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20  Info(pParse);.  
10340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
10350 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
10360 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
10370 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
10380 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
10390 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
103a0 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
103b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
103c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
103d0 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  g = i;.         
103e0 20 70 45 78 70 72 2d 3e 69 41 67 67 43 74 78 20   pExpr->iAggCtx 
103f0 3d 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3b 0a 20  = pNC->nDepth;. 
10400 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
10410 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
10420 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
10430 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
10440 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
10450 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
10460 20 70 4e 43 2d 3e 6e 44 65 70 74 68 3d 3d 30 20   pNC->nDepth==0 
10470 29 7b 0a 20 20 20 20 20 20 20 20 61 41 67 67 20  ){.        aAgg 
10480 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a  = pParse->aAgg;.
10490 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
104a0 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
104b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
104c0 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73   if( !aAgg[i].is
104d0 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
104e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
104f0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
10500 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20  (aAgg[i].pExpr, 
10510 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
10520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10540 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
10550 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29  >=pParse->nAgg )
10560 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 65  {.          u8 e
10570 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
10580 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
10590 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
105a0 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
105b0 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72       if( i<0 ) r
105c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
105d0 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
105e0 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  i].isAgg = 1;.  
105f0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
10600 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20  aAgg[i].pExpr = 
10610 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
10620 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
10630 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  .pFunc = sqlite3
10640 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
10650 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
10660 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
10670 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
10680 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20  oken.n,.        
10690 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
106a0 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69  ist ? pExpr->pLi
106b0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
106c0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
106d0 7d 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  }.        pExpr-
106e0 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
106f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
10700 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10710 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
10720 65 63 74 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  ect ){.    pNC->
10730 6e 44 65 70 74 68 2b 2b 3b 0a 20 20 20 20 77 61  nDepth++;.    wa
10740 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 70 45 78  lkSelectExpr(pEx
10750 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 61 6e 61  pr->pSelect, ana
10760 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70  lyzeAggregate, p
10770 4e 43 29 3b 0a 20 20 20 20 70 4e 43 2d 3e 6e 44  NC);.    pNC->nD
10780 65 70 74 68 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65  epth--;.  }.  re
10790 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
107a0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
107b0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
107c0 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
107d0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
107e0 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
107f0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
10800 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
10810 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
10820 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
10830 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
10840 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
10850 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
10860 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
10870 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
10880 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
10890 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
108a0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
108b0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
108c0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
108d0 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  lveNames()..**.*
108e0 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
108f0 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
10900 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
10910 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
10920 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
10930 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
10940 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
10950 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
10960 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
10970 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
10980 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 4e 43    int nErr = pNC
10990 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a  ->pParse->nErr;.
109a0 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
109b0 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67 67  Expr, analyzeAgg
109c0 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
109d0 72 65 74 75 72 6e 20 70 4e 43 2d 3e 70 50 61 72  return pNC->pPar
109e0 73 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b  se->nErr - nErr;
109f0 0a 7d 0a                                         .}.